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 知道必须将什么连接在一起才能使用上述代码查询标签。
我对 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 知道必须将什么连接在一起才能使用上述代码查询标签。