获取所有已标记为属于用户的任何兴趣的帖子

时间:2016-04-21 16:00:20

标签: sql ruby-on-rails ruby activerecord relationships

我正在建立一个网站,在注册后用户选择他们感兴趣的内容。因此,用户只能看到与他们相关的帖子。用户和兴趣(在我的案例标签中)之间的关系是通过连接表的多对多关系。此外,用户可以创建帖子并向帖子添加标签。标签可以有很多帖子。因此,标签和帖子之间的关系是通过连接表的多对多关系。在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的所有帖子。感谢

1 个答案:

答案 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对象。