自身のクラスを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? }
が真になる要素を抜き出したいです。