1

を探す私の質問は、この質問に非常に似ています。Want to find records with no associated records in Rails 3特定の分野に関連のないすべてのレコード

しかし、ひねりを加えました。例を使って問題を追加しましょう。

class Person 
    has_many :friends 
end 

class Friend 
    belongs_to :person 
    attr_accessor :type # this can be 'best' or 'acquaintance' 
end 

「最高の」友達がいないすべての人を欲しいです。私が見るほとんどの場合の通常のクエリは、友人なしで人を取得することです。それは次のようになります:

Person.includes(:friends).where(:friends => { :person_id => nil }) 

しかし、それは私が望むものではありません。彼らが持っている他の多くのタイプの友達に関係なく、「最高の」友人を持たないすべての人々を得る方法がありますか?

答えて

0

お問合せに否定をサポートレール4.2を使用している場合のような何か行うことができます。それ以外の場合は

Person.includes(:friends).where.not(friends: { type: "best" }) 

を:

Person.includes(:friends).where("friends.type != 'best'") 

更新

たぶん少しあなたはこのようなものをマップすることができるので、enumをアクティブレコードから使用することを検討するかもしれません:

class Friend 
    belongs_to :person 
    enum type: {best: 0, acquaintance: 1} 
end 

その後は、このような問い合わせができます

Person.includes(:friends).where.not(friends: { type: Friend.types[:best] }) 

それは読みやすく、ルビーフレンドリーになり、値をデシベルでの整数として格納されているので、文字列を使用して回避します。しかしだけでも、これを行うには、必ずしも最もパフォーマンス、道ではない

0

最も簡単には、NOT EXISTSサブクエリを使用することです:あなたは簡単に組成物のためのPersonの範囲としてこれを定義することができます

Person.where('NOT EXISTS(SELECT 1 FROM friends WHERE person_id=persons.id AND type=?)', 'best') 

注:Gustavoのソリューションは期待通りに読めるが、親友ではない友人がいる人は誰でも返すということも指摘したい。これは、SQLのwhere句が行ごとにどのように機能し、グループまたは1対多の関係にアサートするのに問題があるかによるものです。