Rails:使用自定义方法订购自定义模型

时间:2015-12-18 02:05:22

标签: ruby-on-rails ruby sorting

我有一个名为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”

我想知道如何使用返回值的自定义方法订购我的产品。

2 个答案:

答案 0 :(得分:1)

一般情况下,你不能。订购发生在您的数据库中,该数据库不了解您在应用程序中键入的任何方法。您需要的是一种将方法转换为有效sql的方法。在您的情况下,您可以这样做:

Product.joins(:reviews).group('products.id').order('AVG(reviews.grade)')

这将为您提供排序结果和关系对象。但是,与join的关系并不是很好用,特别是如果你尝试添加另一个连接。当数据库增长时,这可能会变得非常慢。

答案 1 :(得分:0)

您在示例中执行的操作是运行查询,然后使用sort_by对结果集进行排序。

如果要返回activerecord集合而不是数组,并且可能将其与其他作用域链接起来,则应将逻辑从方法移动到SQL中,并将其放在作用域中。