【发布时间】:2013-06-23 14:37:58
【问题描述】:
我相信这是一个简单的红宝石问题。在我的应用程序中,我有具有多个评论的产品模型。每条评论都有一个“整体”评级属性,它是一个整数。
我想做的是根据总体评分的平均值显示前十名产品。我已经让这个工作了,但是,我还想通过二级聚合属性对具有相同总体评级的产品进行排序,这将是该产品有多少评论。现在,如果我有 3 件产品的平均总体评分相同,它们似乎会以随机顺序显示。
到目前为止,我的代码是:
控制器
@best = Product.has_reviews.get_best_products(10)
产品型号
scope :has_reviews, joins{reviews.outer}.where{reviews.id != nil}
def self.get_best_products(number)
sorted = self.uniq
sorted = sorted.sort { |x, y| y.reviews.average("overall").to_f <=> x.reviews.average("overall").to_f }
sorted.first(number)
end
我已经为我的模型代码尝试过这个:
def self.get_best_products(number)
sorted = self.uniq.sort! { |x, y| x.reviews.count.to_f <=> y.reviews.count.to_f }
sorted = sorted.sort { |x, y| y.reviews.average("overall").to_f <=> x.reviews.average("overall").to_f }
sorted.first(number)
end
...但它并没有做我想做的事。我只是在我的视图中使用 each 遍历 @best 数组。
---更新
好的,现在我正在尝试这个:
控制器:
@best = Product.get_best_products(6)
型号:
def self.get_best_products(number)
self.joins{reviews}.order{'AVG(reviews.overall), COUNT(reviews)'}.limit(number)
end
但我收到此错误:
PGError: ERROR: column "products.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "products".* FROM "products" INNER JOIN "reviews" ...
顺便说一句,我正在使用 Squeel gem 以避免在模型中直接使用 SQL 代码。
----更新2
现在我将“组”部分添加到我的方法中,但仍然出现错误:
def self.get_best_products(number)
self.joins{reviews}.group('product.id').order{'AVG(reviews.overall), COUNT(reviews)'}.limit(number)
end
我收到此错误:
PGError: ERROR: missing FROM-clause entry for table "product"
LINE 1: ...eviews"."product_id" = "products"."id" GROUP BY product.i...
【问题讨论】:
-
在数据库中进行排序不是更好吗? IE。使用
order而不是sort。 -
应该是
products.id而不是product.id。我的错。
标签: ruby-on-rails