我无法找到直接使用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
非常感谢任何建议!
答案 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%,但是试一试:)