Rails通过记录协会查询
问题描述:
我对Rails比较陌生,为了学习更多,我试图构建一个简单的博客。我正在运行的一个问题是标记。我有一个Tag
模型,用于创建和管理可应用于帖子的标签。我也有一个Post
模型。我需要能够将任何标签与帖子相关联,检索它们以输出,并且能够通过特定标签过滤/查询帖子。Rails通过记录协会查询
到目前为止,我在Post
上创建了一个名为tags
的列,该列被分配了一个Tag
ID的数组,然后被序列化。这对于检索很有用,但我的理解是,试图通过序列化列查询记录是big no-no。
正如上面的链接推荐,我这样做,以实现我的过滤器:
Post.all.select { |post| post.tags.include? 3 }
但我知道,这是收集所有我的职位,然后使用数组方法select
过滤通过他们。
我的问题是:如何将Tag
记录与Post
记录相关联,并通过给定标签查询/过滤记录记录?
答
因此,让我们假设你的模型是这样的:
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
所以引用的Tagging是加盟模式,让您在使用标签和帖子很多-to-many关联。
在这一点上,添加标签后是简单的:
post.tags << Tag.create(name: 'foo')
您可以通过活动记录查询此,通过在这里使用嵌套的哈希值。
Post.joins(:tags).where(tags: { name: 'foo' })
请记住,此处的标记是我们在模型中声明的关系的名称,而不是实际的基础表。那么,这实际上要做的是运行SQL,看起来像
select * from posts
inner join taggings on taggings.post_id = posts.id
inner join tags on taggings.tag_id = tag.id
where tags.name = 'foo';
既然我们已经声明了表是如何在模型相关,导轨知道它必须联合起来,查询标签与上面的代码。
对不起,这花了这么长时间。工作完美!谢谢! –