【问题标题】:Rails: Order custom model using custom methodRails:使用自定义方法订购自定义模型
【发布时间】:2015-12-18 10:52:20
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby sorting


    【解决方案1】:

    一般来说,你不能。排序发生在您的数据库中,它不知道您在应用程序中键入的任何方法。您需要一种将您的方法转换为有效 sql 的方法。在你的情况下,你可以这样做:

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

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

    【讨论】:

      【解决方案2】:

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

      如果您想取回一个 activerecord 集合而不是一个数组,并可能将其与其他范围链接,您应该将逻辑从您的方法移动到 SQL 中,并将其放入一个范围中。

      【讨论】:

        猜你喜欢
        • 2016-12-23
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        • 2017-04-18
        • 2021-01-06
        相关资源
        最近更新 更多