Rails按记录关联查询

我对Rails相对较新,并且想要了解更多我正在尝试构建一个简单的博客。 我正在进行的一个问题是标记。 我有一个Tag模型,我用它来创建和管理可以应用于post的标签。 我也有一个Post模型。 我需要能够将任何标签与post相关联,检索它们以获得输出,并能够通过特定标签过滤/查询post。

到目前为止,我已经在Post上创建了一个名为tags的列,它被分配了一个Tag ID数组,然后被序列化。 这非常适合检索,但我的理解是,尝试通过序列化列查询记录是一个很大的禁忌 。

正如上面的链接建议,我已经这样做以实现我的filter:

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

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

我的问题是:如何将任意数量的Tag记录与Post记录关联,并按给定标记查询/过滤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 

因此标记是连接模型,它为您提供与标记和post的多对多关联。

此时,向post添加标签非常简单:

 post.tags << Tag.create(name: 'foo') 

您可以通过在where中使用嵌套哈希来通过活动记录进行查询。

 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'; 

由于我们已经声明了表格在模型中是如何相关的,因此rails知道它必须连接在一起以使用上面的代码查询标签。