我是比较新的铁轨和了解更多想建立一个简单的博客。 一到我运行的问题被标记。 我有一个Tag
,我使用创建和管理可以应用到帖子标签模型。 我也有一个Post
模型。 我需要能够与后关联的任何标签,检索它们的输出,并能够通过特定的标签来过滤/查询职位。
到目前为止,我已经创建了一个列上Post
所谓的tags
,其被分配的数组Tag
的ID,然后被序列化。 这个伟大的工程进行检索,但我的理解是,试图通过他们的连载栏目查询记录是一个很大的禁忌 。
正如上面的链接推荐,我这样做,以实现我的过滤器:
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';
既然我们已经声明了表是如何在模型有关,轨道知道它必须联合起来,以查询标签与上面的代码。