通过关联过滤has_many中的字段

时间:2014-01-24 00:51:54

标签: ruby-on-rails ruby-on-rails-3 activerecord has-many-through arel

我无法找到直接使用Active Record过滤has_many通过关系的最佳方法。我在这里发现了一堆几乎解决这个问题的帖子,但没有一个答案对我有用。

组:

     has_many :taggings, as: :taggable
     has_many :tags, :through => :taggings

用户:

     has_many :taggings, as: :taggable
     has_many :tags, :through => :taggings

我想找到所有拥有与单个群组代码匹配的代码的用户

以下方法有效但我宁愿用查询组装列表。

    def interest_matches
      matched_users = Array.new
      self.tags.uniq.each do |tag|
        tag.users.map{ |u| matched_users.push(u) unless matched_users.include?(u) }
      end
      matched_users
    end

非常感谢任何建议!

1 个答案:

答案 0 :(得分:1)

我假设你在一组标签中的标签上调用interest_matches,

次要注意:您在函数的第1行和第3行中调用self.tags.uniq两次。此外,

unless matched_users.include?(u) 

以上将每次遍历数组以检查数组中是否存在用户,而不是最佳选项!下次在最后调用.uniq方法。

无论如何,要回答您的问题,您可能希望联接表能够访问用户的标签。

方法,可能有效也可能无效(希望如此):

 @matched = []
 group_of_tags = (i'm assuming this is predefined)
 @matched << User.joins(:tags).where(tag_name: group_of_tags.pluck(:name))
 @matched.uniq

这不是100%,但是试一试:)