Setup: Rails 3.2.18, PostgresRails: Rientro solo gli oggetti in cui tutte le associazioni incontrano una condizione
ho due oggetti, per fare un esempio, chiamarli Author
e Article
, con la seguente configurazione:
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
Sto cercando di trovare tutti i record Author
dove tutti associati Article
record sono pubblicati più di un anno fa. Questo codice:
Author.joins(:article).merge(Article.published_over_one_year_ago)
... torna Author
oggetti in cui almeno un associato Article
viene pubblicato più di un anno fa, ma ho bisogno di soloAuthor
record in cui tutti associati Article
documenti sono più di un anno vecchio. È possibile con arel/ActiveRecord o devo usare SQL raw?
Potenzialmente Solution "di lavoro" SQL:
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 vedo che c'è già una risposta suggerito di usare AREL, che è eccezionale. Qualcuno ha un suggerimento per l'uso diretto di ActiveRecord, se possibile?
Interessante! Hai in mente una soluzione SQL raw? –
Sì, sembra funzionare. Vedi modifica. – CDub