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知道它必须连接在一起以使用上面的代码查询标签。