【问题标题】:Rails query by record associationRails 通过记录关联查询
【发布时间】:2016-01-11 12:58:25
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 抱歉,拖了这么久。工作完美!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2018-01-28
    相关资源
    最近更新 更多