簡體   English   中英

Rails 4通過has_and_belongs_to_many關系加入查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM