Rails 按记录关联查询

Rails query by record association

我对 Rails 比较陌生,为了了解更多信息,我正在尝试构建一个简单的博客。我 运行 涉及的其中一个问题是标记。我有一个 Tag 模型,用于创建和管理可应用于 post 的标签。我还有一个 Post 模型。我需要能够将任何标签与 post 相关联,检索它们以进行输出,并能够通过特定标签 filter/query posts。

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

正如上面 link 所建议的,我这样做是为了实现我的过滤器:

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

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

我的问题是:如何将任意数量的 Tag 条记录与一条 Post 条记录相关联,并通过给定标签 query/filter 发布记录?

所以让我们假设您的模型如下所示:

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

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

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

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

您可以通过活动记录查询此内容,方法是在 where 中使用嵌套哈希。

Post.joins(:tags).where(tags: { name: 'foo' })

请记住,这里的标签是我们在模型中声明的关系的名称,而不是实际的底层 table。所以这实际上要做的是 运行 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';

由于我们已经声明了 table 在模型中的关联方式,rails 知道必须将什么连接在一起才能使用上述代码查询标签。