Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在ruby中,如何构建一个对象,为数据库中的一组值提供平均值、高值和低值?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 在ruby中,如何构建一个对象,为数据库中的一组值提供平均值、高值和低值?

Ruby on rails 在ruby中,如何构建一个对象,为数据库中的一组值提供平均值、高值和低值?,ruby-on-rails,ruby,Ruby On Rails,Ruby,鉴于: 在ruby(rails)中,如何返回一个JSON对象,该对象具有用户每个技能id的平均评级,例如: Model: Rating id | user_id (person being rated) | rated_by | skill_id | rating(int 1..5) @ratings = Rating.where(:user_id => 1) 1, 1, user1, 1, 5 2, 1, user1, 2, 2 3, 1, user1, 5, 3 4, 1, user

鉴于:

在ruby(rails)中,如何返回一个JSON对象,该对象具有用户每个技能id的平均评级,例如:

Model: Rating
id | user_id (person being rated) | rated_by | skill_id | rating(int 1..5)

@ratings = Rating.where(:user_id => 1)
1, 1, user1, 1, 5
2, 1, user1, 2, 2
3, 1, user1, 5, 3
4, 1, user2, 1, 5
4, 1, user2, 2, 1
4, 1, user2, 3, 2
...
谢谢

2种我能想到的方法: 1) 逻辑由Rails服务器处理(仅一个DB调用)

其中1979
skill\u id
s


2) 逻辑由数据库处理(多个数据库调用),但Rails服务器不会占用更多的处理能力。我更喜欢上面的第一种解决方案,所以如果你喜欢第二种方法,请告诉我,我会更新我的答案。如果您的内存资源受到限制/您在该请求中检索到了数千个评级,那么为了提高效率,最好采用第二种方法。

groupby
是ruby core的一部分。如果解决方案2),请使用
group
而不是
groupby
,因为
group
是一个数据库查询,而
groupby
是一个简单的数组关于&,请看这一点,它基本上只是一个简写。i、 e.
grouped_ratings.max_by{r|r.rating}
进入
grouped_ratings.max_by(&:rating)
哦,你说得对,我更新了我的答案,变成了
json_repose={}
太棒了!没问题:)
@rating_tally =
 [ skill_id, 
   average rating, 
   number of submission per skill_id, 
   lowest_rating, 
   highest_rating
 ]
# an example implementation
class SomeController < ApplicationController
  def some_action
    json_response = {}

    ratings = Rating.where(user_id: 1)

    ratings.group_by(&:skill_id).each do |skill_id, grouped_ratings|
      lowest_rating = grouped_ratings.max_by(&:rating).rating
      highest_rating = grouped_ratings.min_by(&:rating).rating
      count = grouped_ratings.size
      average_rating = grouped_ratings.sum(&:rating) / count

      json_response[skill_id] = {
        lowest_rating: lowest_rating,
        highest_rating: highest_rating,
        count: count,
        average_rating: average_rating
      }
    end

    render json: json_response
  end
end
{
  "19": {
    "lowest_rating": 5,
    "highest_rating": 9,
    "count": 4
    "average_rating": 8.5
  },
  "79": {
    "lowest_rating": 4,
    "highest_rating": 10,
    "count": 9
    "average_rating": 9.5
  }
}