0

我有一个模型类别,其中有_many 产品,而产品又是 has_many 类别。当用户搜索类别时,我想返回匹配类别的产品而不会丢失我的 Arel 对象。这是我到目前为止所拥有的:

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

这是退回产品的诀窍,但当然我拥有的是一个数组而不是 Arel。我可以添加一个:includes(:products)子句,所以我确实可以取回产品,但我仍然将它们附加到它们的类别中。如何调整我的查询,以便我得到的只是一个仅针对产品的 Arel?

4

1 回答 1

4

如果是您想要的产品,那么您可能应该在搜索时从 Product 对象开始。例如,你可以这样做:

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

我使用 not 的原因joinsincludesjoin 将执行 INNER JOIN 而不是 LEFT OUTER JOIN,这是您只需要返回与找到的类别实际关联的产品。

为了使它更优雅一点,您可以将它全部包装在 Product 模型的范围中,如下所示:

# 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])
于 2012-04-24T02:23:07.730 回答