0

我对Rails比较陌生,为了学习更多,我试图构建一个简单的博客。我正在运行的一个问题是标记。我有一个Tag模型,用于创建和管理可应用于帖子的标签。我也有一个Post模型。我需要能够将任何标签与帖子相关联,检索它们以输出,并且能够通过特定标签过滤/查询帖子。Rails通过记录协会查询

到目前为止,我在Post上创建了一个名为tags的列,该列被分配了一个Tag ID的数组,然后被序列化。这对于检索很有用,但我的理解是,试图通过序列化列查询记录是big no-no

正如上面的链接推荐,我这样做,以实现我的过滤器:

Post.all.select { |post| post.tags.include? 3 } 

但我知道,这是收集所有我的职位,然后使用数组方法select过滤通过他们。

我的问题是:如何将Tag记录与Post记录相关联,并通过给定标签查询/过滤记录记录?

回答

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 

所以引用的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'; 

既然我们已经声明了表是如何在模型相关,导轨知道它必须联合起来,查询标签与上面的代码。

+0

对不起,这花了这么长时间。工作完美!谢谢! –