我有两个模型,帖子和标签,它们之间有多对多的关系。我用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
答案 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])