2012-04-24 73 views
0

我有一個模型類別,has_many產品和一個產品依次has_many類別。當用戶搜索類別時,我想返回匹配的類別的產品而不會丟失我的Arel對象。這是我到目前爲止:如何僅在Rails「where」查詢中選擇關聯的對象?

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

這沒有返回產品的技巧,但我當然是一個數組而不是Arel。我可以添加一個:includes(:products)條款,所以我確實獲得了這些產品,但我仍將它們附加到它們的類別中。如何調整我的查詢,以便我回來的是隻能解決產品問題的Arel?

回答

3

如果它是您想要的產品,那麼您應該在搜索時從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]) 
+1

[「使用一個類的方法是接受範圍參數的首選方式」] (http://guides.rubyonrails.org/active_record_querying.html#passing-in-arguments),但這主要是nit挑選。 – 2012-04-24 02:32:09

+0

謝謝,這是一個很好的觀點。 – DanneManne 2012-04-24 02:56:03

+0

只爲記錄:'def self.in_categories_like(search_term);加入(:categories).where(「upper(categories.title)like?」,search_term.upcase); end'。 – 2012-04-24 07:18:10