2016-12-07 56 views
1

所以我想編寫一個查詢來獲取基於他們有能力的用戶,執行是這樣的:acts_as_taggable_on多個字段的查詢使用OR

用戶有原發性和繼發性的技能,使用acts_as_taggable_on兩個

這個範圍我現在已經有了

scope :by_skills, (lambda do |primary, secondary| 
    if primary.present? && secondary.present? 
    tagged_with(primary, on: :primary_skills, any: true) 
     .tagged_with(secondary, on: :secondary_skills, any: true) 
    elsif primary.present? 
    tagged_with(primary, on: :primary_skills, any: true) 
    elsif secondary.present? 
    tagged_with(secondary, on: :secondary_skills, any: true) 
    end 
end) 

這個問題現在是,如果初級&二次出現,打響了查詢將是一個AND即小學和SE condary, 我想它是一個OR,而絕不是我能夠明白這一點

+0

該死的,爲什麼我沒有想到..讓我試試看。謝謝:) – Alfie

+0

你試過了嗎? – archana

回答

2

儘量or Rails中5

scope :by_skills, (lambda do |primary, secondary| 
    if primary.present? && secondary.present? 
    tagged_with(primary, on: :primary_skills, any: true).or(
     tagged_with(secondary, on: :secondary_skills, any: true)) 
    elsif primary.present? 
    tagged_with(primary, on: :primary_skills, any: true) 
    elsif secondary.present? 
    tagged_with(secondary, on: :secondary_skills, any: true) 
    end 
end) 
+0

是的,那工作。謝謝:) – Alfie

+0

但是我要添加另一個適用於由acts_as_taggable_on支持的所有rails版本的答案。 – Alfie

0

介紹我並最終使用的or方法Rails 5中引入的ActiveRecord,如@archana所述。

但在我使用之前,我試圖找出另一種方法來做同樣的事情,並且看起來有點像acts_as_taggable_on的設計。

所以,即使有兩個不同的聯想稱爲primary_skills & secondary_skills都是確實與同桌tags關聯的通表taggings

這意味着users表有關聯與tags表,盤算,現在一切都更清晰了。該解決方案是這樣的:

Users.includes(:primary_skills, :secondary_skills).where(tags: { name: (primary + secondary) }) 

這將適用於所有已軌,是支持acts_as_taggable_on版本。