我正在建立一个网站,在注册后用户选择他们感兴趣的内容。因此,用户只能看到与他们相关的帖子。用户和兴趣(在我的案例标签中)之间的关系是通过连接表的多对多关系。此外,用户可以创建帖子并向帖子添加标签。标签可以有很多帖子。因此,标签和帖子之间的关系是通过连接表的多对多关系。在users
表中,我有一个tag_ids
列,用于存储集合。与posts
表格相同,我有一个tag_ids
列,用于存储集合。
在我的用户模型中,我有
has_many :user_tags
has_many :tags,:through => :user_tags
在我的Post模型中我有
has_many :post_tags
has_many :tags,:through => :post_tags
如果我做了current_user.tag_ids
之类的话,我会得到类似[2, 3]
的内容。如果我确实像Post.first.tag_ids
那样得到[2, 4, 7]
之类的东西。希望你能得到一般情况。那么,如果可能的话,如何使用活动记录提取post tag_ids列中当前用户的任何tag_ids的所有帖子。感谢
答案 0 :(得分:2)
我能想到的最简单的方法是简单地查询current_user和post的tag_ids,找到两者之间的任何常见tag_id,并查询数据库中的实际基于这些ID的标签。这是一个基本的演练:
# Get the current_user's tags
user_tags = current_user.tag_ids
# Map over all of the existing posts and grab all tag_ids
# Once you have them, flatten the result into a single array and make all values unique
post_tags = Post.all.map { |p| p.tag_ids }.flatten.uniq
# Find any common tags using '&'
common = user_tags & post_tags
然后,您可以查看生成的公共数组,并使用枚举器.map
方法查找每个相关标记:
# Map over common and find the relevant tags - return them in a new array
common.map do { |t_id| Tag.find(t_id) }
这将为您提供实际的Tag对象。