【问题标题】:Rails 4 Join query through has_and_belongs_to_many relationshipRails 4 通过 has_and_belongs_to_many 关系加入查询
【发布时间】:2016-07-24 15:20:03
【问题描述】:

我有两个模型,帖子和标签,它们之间是多对多的关系。我已经用一个由posts.post_id 和tags.tag_id 组成的posts_tags 表实现了这种关系。

我正在尝试获取具有特定标签的所有帖子的活动记录对象。我有这个使用代码:

posts_i_want = []
all = Post.all
all.each do |x|
    x.tags.each do |y|
        if y.tag == params[:tag]
            posts_i_want.push(x.id)
        end
    end
end
@posts = Post.where(id: posts_i_want)

但从阅读该主题来看,似乎有更好的方法来做到这一点。 类似于:

@posts = Post.joins("INNER JOIN posts_tags ON posts.post_id = posts_tags.post_id INNER JOIN tags ON posts_tags.tag_id = tags.tag_id WHERE tags.tag = #{params[:tag]}")

@posts = Post.joins(posts_tags: :tags).where(tag: params[:tag])

但我没有找到正确的工作方式。我希望有 ruby​​ on rails 经验的人可以提出解决方案的样子。谢谢!

附言使用postgresql

【问题讨论】:

    标签: ruby-on-rails postgresql join


    【解决方案1】:

    你可以试试这个吗

    @posts = Post.joins(:posts_tags).where(posts_tags: { tag: params[:tag] })
    

    编辑:看着你的迭代代码,你似乎不需要 post_tags 加入。你实际上需要一个标签加入所以

        @posts = Post.joins(:tags).where(tag: params[:tag])
    

    【讨论】:

    • 感谢您的尝试!但这会返回一个空的 activerecord 对象。但它不会崩溃。
    【解决方案2】:

    假设这个模型:

    class Post < ApplicationRecord
      has_and_belongs_to_many :tags
    end
    

    你想这样做:

    @posts = Post.joins(:tags).where(tags: { tag: params[:tag] })
    

    joins(:tags) 拉入 habtm 关联。

    { tags: { ... } } 指定 habtm 关联。

    { tag: ... } 指定 Tag 类 (Tag#tag) 上的 tag 属性。

    希望这是有道理的!

    【讨论】:

      【解决方案3】:

      您的查询应如下所示

      @posts = Post.joins(:posts_tags).joins(:tags).where(tag: params[:tag])
      

      @posts = Post.{name of relationship}.find_by(tag: params[:tag])
      

      【讨论】:

      • 他实际上并不需要加入posts_tags,虽然看起来他已经有很多通过关系,只加入标签就足够了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多