Rails:优化Active Record查询而不是循环

时间:2016-09-19 23:19:58

标签: ruby-on-rails activerecord

class Event
  has_many :keywords, :through => :event_keywords
end

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

我有一个User方法,根据与特定用户共享的关键字计算事件的相关性:

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 个答案:

答案 0 :(得分: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

返回一个数组,其中包含在event和user之间共享的所有关键字。然后你可以遍历它并做你需要做的事情。