Rails按记录关联查询

时间:2015-10-13 16:55:16

标签: ruby-on-rails serialization ruby-on-rails-3.2 rails-activerecord

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

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

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

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

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

我的问题是:如何将任意数量的Tag记录与Post记录相关联,并按给定标记查询/过滤帖子记录?

1 个答案:

答案 0 :(得分: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

因此,标记是连接模型,可以为您提供与标记和帖子的多对多关联。

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

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知道如何将它们连接在一起以使用上述代码查询标记。