Rails 4通过has_and_belongs_to_many关系加入查询

时间:2016-07-24 15:20:04

标签: ruby-on-rails postgresql join

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

我正在尝试使用特定标记获取所有帖子的有效记录对象。我使用了代码:

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经验可以提出解决方案的样子。谢谢!

P.S。使用postgresql

3 个答案:

答案 0 :(得分:0)

请你试试吗

@posts = Post.joins(:posts_tags).where(posts_tags: { tag: params[:tag] })
编辑:看着你的迭代代码,你似乎不需要post_tags连接。你实际上需要一个标签加入

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

答案 1 :(得分:0)

假设这个模型:

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属性。

希望有意义!

答案 2 :(得分:-1)

您的查询应该是

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

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