2016-09-19 23 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!这比我想象的要容易得多:) –