2016-07-14 10 views
0

私は愚かだと感じますが、私はこれに対する答えを見つけることができません。適切でin in Railsの

User.where("attributes.id IN ?", list_of_attribute_ids) 

結合または含むか、またはものは何でも:

私は属性のリスト与えられた多くの属性を持つユーザーを、持っている場合、私はレールにこのような何かを求めることができます。

しかし、これらのユーザーの逆セットを見つける方法はわかりません。つまり、結果が75のエントリを返した場合、100人のユーザが与えられた場合、他の25人を見つける方法はわかりません!

私は

User.where("attributes.id NOT IN ?", list_of_attribute_ids) 

は(同様に、User.where.notを)うまくいくかもしれないが、それはない!と思いました代わりに、の属性のいずれかがリストのいずれかではないユーザーを探しますが、これは便利ですが、私が望むものではありません。ソートのIDがない中(IDのリストを収集)を選択し、ユーザーのためのSQLのようなものです

User.where.not(id: User.where("attributes.id IN ?", list_of_attribute_ids).pluck(:id)) 

私はそれを行う方法を知っている唯一の方法は、のようなものです。

しかし、これは大量にであり、一般的には数百を超えるエントリを持つデータベースには対応できません。

どうすればよいですか?

+0

だから、あなたの最初の文の適切な "逆" は、すべてのユーザーがマイナス一致した者です最初の声明。あなたの正確なニーズに応じて、いくつかのアプローチが可能です。両方のセットが同時に必要な場合は、データセット全体を読み込んでから一致するユーザのID(属性付き)を取り出し、アプリ内で分割/グループ化できます。あるいは、あなたの最後の質問をすることができます。 –

+0

http://guides.rubyonrails.org/active_record_querying.html#left-outer-joinsこれはあなたを助けるかもしれない – Vishal

答えて

0

コメントに記載されている@ Vishalのような、左外部の結合を使うことができると思います。

ガイドを参照してください:http://guides.rubyonrails.org/active_record_querying.html#left-outer-joins

レール4:

joins("LEFT OUTER JOIN <something>") 

レール5:

left_outer_joins(:something) 
+0

はい、そうです、私は今それが左外部結合であることを学びました。レール5にはleft_outer_joinメソッドがありますが、<= 4では、User.joins( "LEFT OUTER JOINSの属性はattributes.id?"、list_of_attribute_ids).where( "attributes IS NULL")のようなもので処理されています。 。重要なのは、左外部結合がまだ関連付けられていないレコードを保持していることです。 will_paginateはいくつかの問題を投げたので、まだ完全な問題を解決する方法はありませんが、これがこの問題の答えです。本当にありがとう。 – Tony

+0

anwser @Tonyを編集しました – siegy22

+0

感謝のようなコメントは避けてください。ハ - ありがとう@ラヴェン。申し訳ありません – Tony