2017-07-17 14 views
1

をcontaingたレコードを検索します。私はチェーンに条件を指定する方法を見つけようとしています - 特定のタグが割り当てられているユーザーのフィルタリング(このタグのIDは不明です。ちょうどkeyが知られています)。私は、次のDBスキーマを持っている特定のタグ

だから、ここに私のコードがどのように見えるか、多かれ少なかれです:

col = User.all 

col = col.where('cats_count <= 0') if args[:no_cat] 
col = col.where('dogs_count <= 0') if args[:no_dog] 
col = col.where('other_pets_count <= 0') if args[:no_other_pet] 

# ... tag logic filtering here ... 

col = col.where('age > 100') if args[:old] 

と私は割り当てられkey=non_smokingTagを持っているユーザーのためにフィルタリングします。理想的には、私はそれが重要であれば、データベースエンジンindependentenであることが大好きです。私はsqlite/postgresを使っています。

正直なところ私はそれをどう対処するかについて全く考えていません。おそらく、SQLの問題やRails/ActiveRecordの知識が不足している可能性があります。

答えて

3

joinsとput conditions on the joined tablesを指定できます。だから多分何かのように(私の頭の上からテストされていない)

col.joins(user_tags: :tag).where(user_tags: { tag: { key: 'non_smoking' } }) 
+0

ところで、それぞれの 'col.where'の間に何か必要はありませんか? 'OR' /' AND'のように?それはSQL-meを悩ましています... – Blag

+2

デフォルトでは 'where 'は' AND 'を使用してチェーンされていますが、必要に応じて' OR 'にすることもできます([ActiveRecord OR query](https:// stackoverflowを参照)。 com/questions/3639656/activerecord-or-query)) –

関連する問題