Ruby on rails Rails 4通过has_和_-belies_-to_-many关系进行连接查询

Ruby on rails Rails 4通过has_和_-belies_-to_-many关系进行连接查询,ruby-on-rails,postgresql,join,Ruby On Rails,Postgresql,Join,我有两个模型,贴子和标签,它们之间有多对多的关系。我用posts\u tags表实现了这种关系,表由posts.post\u id和tags.tag\u 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

我有两个模型,贴子和标签,它们之间有多对多的关系。我用posts\u tags表实现了这种关系,表由posts.post\u id和tags.tag\u 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]}")

但我没有找到合适的工作方式。我希望有RubyonRails经验的人能够建议解决方案。谢谢


p、 你能试试这个吗

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

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

您的查询应该如下所示

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

假设此模型:

class Post < ApplicationRecord
  has_and_belongs_to_many :tags
end
加入:标签加入habtm协会

{tags:{…}}指定habtm关联

{tag:…}指定标记类Tagtag上的标记属性


希望这有意义

谢谢你的努力!但它返回一个空的activerecord对象。虽然它没有崩溃,但他实际上并不需要加入posts\u标签,因为看起来他已经有了很多直通关系,仅仅加入标签就足够了
@posts = Post.{name of relationship}.find_by(tag: params[:tag])
class Post < ApplicationRecord
  has_and_belongs_to_many :tags
end
@posts = Post.joins(:tags).where(tags: { tag: params[:tag] })