1. ホーム
  2. ruby-on-rails

[解決済み】Railsで関連するレコードがないレコードを探したい

2022-04-12 09:49:13

質問

簡単なアソシエーションを考えてみよう...

class Person
   has_many :friends
end

class Friend
   belongs_to :person
end

ARelやmeta_whereに友達がいない人をすべて取得する一番きれいな方法は何ですか?

そして、has_many :through 版はどうでしょう。

class Person
   has_many :contacts
   has_many :friends, :through => :contacts, :uniq => true
end

class Friend
   has_many :contacts
   has_many :people, :through => :contacts, :uniq => true
end

class Contact
   belongs_to :friend
   belongs_to :person
end

counter_cache は使いたくないし、読んだ限りでは has_many では使えないようです :through

Rubyでperson.friendsのレコードをすべて取得してループさせるのではなく、meta_search gemで使用できるクエリ/スコープが欲しいです。

クエリのパフォーマンスコストは気にしない

そして、実際のSQLから遠ければ遠いほど良い...。

解決するには?

これはまだSQLにかなり近いですが、最初のケースで友達がいない全員を獲得できるはずです。

Person.where('id NOT IN (SELECT DISTINCT(person_id) FROM friends)')