簡體   English   中英

如何僅在Rails“位置”查詢中選擇關聯的對象?

[英]How do I select only the associated objects in a Rails “where” query?

我有一個模型類別,它有has_many個產品,而一個產品又有has_many個類別。 當用戶搜索類別時,我想返回匹配類別的產品而不丟失我的Arel對象。 這是我到目前為止的內容:

Category.where("upper(title) like ?", search_term.upcase).map {|category| category.products}.flatten

這確實有返回產品的技巧,但是我擁有的當然是數組而不是Arel。 我可以添加一個:includes(:products)子句,因此確實可以收回產品,但仍將它們附加到其類別中。 如何調整查詢,使我得到的只是一個僅解決產品問題的Arel?

如果是您想要的產品,那么在搜索時可能應該從Product對象開始。 例如,您可以這樣做:

Product.joins(:categories).where("upper(categories.title) like ?", search_term.upcase)

我使用joins而不是includes的原因是聯接將執行INNER JOIN而不是LEFT OUTER JOIN,這是您只需要返回與找到的類別實際相關聯的產品所需要的。

為了使其更加優雅,您可以將其全部包裝在產品模型的范圍中,如下所示:

# In Product.rb
scope :in_categories_like, Proc.new{ |search_term|
  joins(:categories).where("upper(categories.title) like ?", search_term.upcase) 
}

# In use
@products = Product.in_categories_like(params[:search_term])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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