konfiguracji: Szyny 3.2.18, PostgreSQLSzyny: Powrót tylko obiekty w którym wszystkie stowarzyszenia spełniają warunek
Mam dwa obiekty, przez wzgląd na przykład, nazwać je Author
i Article
o następującej konfiguracji:
class Author
has_many :articles
...
end
class Article
belongs_to :author
class << self
def published_over_one_year_ago
where(arel_table[:published_at].lt(1.year.ago))
end
end
end
Próbuję znaleźć wszystkie rekordy Author
, gdzie wszystkie powiązane powiązane są z rekordami Article
ponad rok temu. Ten kod:
Author.joins(:article).merge(Article.published_over_one_year_ago)
... zwraca Author
obiektów gdzie przynajmniej jeden związane Article
została opublikowana ponad rok temu, ale muszę tylkoAuthor
rekordy gdzie wszystkie związane Article
rekordy są w ciągu jednego roku stary. Czy jest to możliwe z Arel/ActiveRecord, czy też muszę używać surowego SQL?
Potencjalnie "Working" SQL Rozwiązanie:
query = ERB.new(<<-SQL_END).result(binding)
'author'.id in (
select art.author_id
from articles art
group by art.author_id
having sum(case (art.published_at::date >= current_date) when true then 1 else 0 end) = 0 AND
sum(case(art.published_at::date < current_date) when true then 1 else 0 end) > 0
)
SQL_END
# The following now appears to do what I want it to do.
Author.includes(:articles).where(query)
UPDATE widzę tam już sugeruje odpowiedź za pomocą Arel, który jest znakomita. Czy ktoś ma sugestię użycia prostego ActiveRecord, jeśli to możliwe?
Ciekawe! Czy masz na myśli surowe rozwiązanie SQL? –
Tak, wygląda na to, że działa. Zobacz edycję. – CDub