2017-07-17 65 views
1

我有以下DB模式:查找記錄方含特定標籤

User 
- id 
- name (String) 

UserTag 
- user_id 
- tag_id 

Tag 
- id 
- key (String) 

,我也有很多的where陳述一個相當複雜的用戶搜索鏈。我試圖找出如何包含另一個條件到我的連鎖店 - 過濾分配了特定標籤的用戶(此標籤的ID是未知的,只是它已知的key)。

所以,這裏是或多或少我的代碼的外觀:

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_smoking一個Tag。理想情況下,我會喜歡它是數據庫引擎independen,如果這很重要 - 我在sqlite/postgres。

老實說我已經完全沒有對如何處理這個任何想法,我可能缺乏SQL的一些知識,然後,用Rails/ActiveRecord的。

回答

3

您可以指定joins而看跌期權conditions on the joined tables。所以,也許像(未經測試,關閉我的頭頂)

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

順便說一句,你不需要每個'col.where'之間的東西嗎?像'OR' /'AND'?它打擾SQL-我... – Blag

+2

默認鏈接'where'的使用「AND」,但你可以得到它是「或」如果你需要它(見[ActiveRecord的OR查詢](https://開頭計算器。 COM /問題/ 3639656/ActiveRecord的-或查詢)) –