我对Rails相对较新,并且想要了解更多我正在尝试构建一个简单的博客。我正在进行的一个问题是标记。我有一个Tag
模型,用于创建和管理可应用于帖子的标签。我也有一个Post
模型。我需要能够将任何标签与帖子相关联,检索它们以获得输出,并能够通过特定标签过滤/查询帖子。
到目前为止,我已经在Post
上创建了一个名为tags
的列,该列被分配了一个Tag
ID数组,然后被序列化。这非常适合检索,但我的理解是尝试按序列化列查询记录是big no-no。
正如上面的链接所推荐,我已经这样做了以实现我的过滤器:
Post.all.select { |post| post.tags.include? 3 }
但我知道这是收集所有我的帖子,然后使用数组方法select
来过滤它们。
我的问题是:如何将任意数量的Tag
记录与Post
记录相关联,并按给定标记查询/过滤帖子记录?
答案 0 :(得分:0)
因此,我们假设您的模型如下所示:
class Post < ActiveRecord::Base
has_many :taggings
has_many :tags, through: :taggings
end
class Taggings < ActiveRecord::Base
belongs_to :post
belongs_to :tag
end
class Tag < ActiveRecord::Base
has_many :taggings
has_many :posts, through: :taggings
end
因此,标记是连接模型,可以为您提供与标记和帖子的多对多关联。
此时,向帖子添加标签非常简单:
post.tags << Tag.create(name: 'foo')
您可以通过在where。
中使用嵌套哈希来通过活动记录进行查询Post.joins(:tags).where(tags: { name: 'foo' })
请记住,这里的标签是我们在模型中声明的关系的名称,而不是实际的基础表。所以这实际上要做的是运行看起来像
的SQLselect * from posts
inner join taggings on taggings.post_id = posts.id
inner join tags on taggings.tag_id = tag.id
where tags.name = 'foo';
由于我们已经在模型中声明了表格的相关性,因此rails知道如何将它们连接在一起以使用上述代码查询标记。