我有一个名为product的自定义模型,它有很多评论。
我有一个计算评论的方法
def rating
total = 0
reviews_count = reviews.count
return 0 if reviews_count == 0
reviews.each do |review|
total += review.grade
end
total.to_f/reviews_count
end
我想知道如何使用此方法订购我的产品。
在products_controller.rb,如果我使用:
@products = Product.all.order("price")
很简单,它给了我按价格订购的产品清单。但是,如果我使用,例如:
@products = Product.all.sort_by{|p| p.rating}
它给了我一个数组而不是“ActiveRecord :: Relation”
我想知道如何使用返回值的自定义方法订购我的产品。
答案 0 :(得分:1)
一般情况下,你不能。订购发生在您的数据库中,该数据库不了解您在应用程序中键入的任何方法。您需要的是一种将方法转换为有效sql的方法。在您的情况下,您可以这样做:
Product.joins(:reviews).group('products.id').order('AVG(reviews.grade)')
这将为您提供排序结果和关系对象。但是,与join的关系并不是很好用,特别是如果你尝试添加另一个连接。当数据库增长时,这可能会变得非常慢。
答案 1 :(得分:0)
您在示例中执行的操作是运行查询,然后使用sort_by对结果集进行排序。
如果要返回activerecord集合而不是数组,并且可能将其与其他作用域链接起来,则应将逻辑从方法移动到SQL中,并将其放在作用域中。