自身のクラスをhas_manyとして持つクラスの子供側の特定のhas_manyの数がゼロの要素を取得する方法
すいません、タイトルをできるだけわかりやすく書こうとしたのですが意味不明になってしまいこれ以上うまく書けませんでした。
Phrase
という自分自身をTranslation
をいう名前のクラスがあり、そのクラスがhas_many
でVoice
というクラスを持つのですが、特定のPhrase
のTranslation
が存在し、そのVoice
が一つもない要素を取得したいのですがクエリがかけずに躓いています。
app/models/phrase.rb
class Phrase < ActiveRecord::Base
has_many :translatabilities
has_many :translations, through: :translatabilities
has_many :voices
end
app/models/translatability.rb
class Translatability < ActiveRecord::Base
belongs_to :phrase
belongs_to :translation, :class_name => 'Phrase'
end
以下の様なクエリを試してみたのですが、これではTranslation
として取得したモデルのVoice
が一つもなくてもPhrase
側のVoice
が存在すると取得対象外になってしまいます。
Phrase.includes(:translations).
where.not(translatabilities: {phrase_id: nil}).
includes(:voices).where(voices: {phrase_id: nil})
どのようにすれば「Translations
が存在し、そのどのTranslation
もVoice
持たない」要素をとってこれるでしょうか?
Rubyの式で書くと
phrase.translations.present? && phrase.translations.all?{|t| t.voices.empty? }
が真になる要素を抜き出したいです。