2016-09-19 57 views
0
class Event 
    has_many :keywords, :through => :event_keywords 
end 

class User 
    has_many :keywords, :through => :user_keywords 
end 

我有一個計算基於其與特定用戶共享的關鍵字事件的關聯用戶的方法的Active Record查詢:眼下的Rails:優化的,而不是循環

User.rb 

def calculate_event_relevance(event_id) 
    event_keywords = event.keywords 

    event_keywords.each do |kw| 
     user_keyword_match = self.keywords.where(id: kw.id).first 

     if user_keyword_match 
      ## do some stuff 
     end 
    end 
end 

,我通過循環每個關鍵字。在循環中,我會查詢用戶是否也有該關鍵字。

有沒有辦法改變一個單一的查詢(並保存到event_keywords),只返回event.keywords,用戶也有,所以我不需要遍歷所有的查詢?

是否有查詢可以查找用戶和事件共有的關鍵字?

回答

1

假設event_keywordsuser_keywords都是數組,您可以使用數組上的&來獲取兩者中存在的值。

例如,

[1,2,3,4,5,9] & [5,6,7,8,9] #=> [5, 9] 

在這種情況下,圖5和9存在於兩個陣列,以便它們被作爲結果返回。

在你的情況,你可以這樣做

share_keywords = event.keywords & self.keywords 

要與事件和用戶之間共享的所有關鍵字返回數組。然後你可以遍歷它並做你需要做的事情。

+0

謝謝@ davidhu2000!這比我想象的要容易得多:) –