[英]rails Specify INNER JOIN column in has_and_belongs_to_many relationship
[英]Rails 4 Join query through has_and_belongs_to_many relationship
我有兩個模型,帖子和標簽,它們之間有多對多的關系。 我已經實現了一個由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])
但是我沒有找到正確的工作方式。 我希望經驗豐富的紅寶石專家可以提出解決方案的外觀。 謝謝!
ps使用postgresql
你可以試試這個嗎
@posts = Post.joins(:posts_tags).where(posts_tags: { tag: params[:tag] })
編輯:看着您的迭代代碼,看來您不需要post_tags加入。 您實際上需要加入標簽,因此
@posts = Post.joins(:tags).where(tag: params[:tag])
假設此模型:
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
屬性。
希望有道理!
您的查詢應如下所示
@posts = Post.joins(:posts_tags).joins(:tags).where(tag: params[:tag])
要么
@posts = Post.{name of relationship}.find_by(tag: params[:tag])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.