使用letrate gem时的总评分

时间:2014-05-31 02:58:32

标签: sql ruby-on-rails ruby

我使用了letrate gem(https://github.com/muratguzel/letsrate),它允许用户对模型的不同属性(称为'尺寸')进行评级(例如" Car" model可以在" price"&" speed")上评分。用户也可以重新评估尺寸。

我想显示评级的总和值,即"价格"的最新价值。加上"速度"的最新价值。我还希望这样做,以便每次用户重新评估任何维度时,总数会自动刷新。

试用后&错误我尝试了以下作为帮助方法:

@rate_dimension_1 =Rate.find_by_rater_id_and_rateable_id_and_dimension(@user.id, @object.id, "speed").stars
@rate_dimension_2 = Rate.find_by_rater_id_and_rateable_id_and_dimension(@user.id, @object.id, "price").stars
total_rating = @rate_dimension_1 + @rate_dimension_2

但我觉得这是非常低效的,因为我可能想要增加尺寸和数量。我确定当记录很多时,这将是一种缓慢的计算方法。我也希望将数据存储在数据库中,当任何评级发生变化时,数据库会更新。

最好的方法是什么?

我想我可以在Rate db中添加一个列,它存储所有维度的总和。非常感谢帮助代码总结每个用户每个型号ID的所有最新尺寸值,并将其存储和放置。然后立即通过ajax显示它?

1 个答案:

答案 0 :(得分:0)

首先,我认为手动计算总评分的更好方法是使用单个查询,而不是两个查询:

total_rating = Rate.sum(:stars, 
  conditions: {rater_id: @user.id, rateable_id: @object.id, dimension: %w(speed price)})

如果您想通过所有尺寸进行操作,只需删除dimension条件:

total_rating = Rate.sum(:stars, 
  conditions: {rater_id: @user.id, rateable_id: @object.id})

无论维数是多少,这都会让您对数据库进行单一查询。