【问题标题】:Return model method in JSON hash with an :include返回带有 :include 的 JSON 哈希中的模型方法
【发布时间】:2012-02-14 09:23:52
【问题描述】:

我有一个非常简单的活动记录查询

def show
  user = User.find(params[:id])
  render :text => user.to_json(:include=>:classes)
end

但是,在我的Class 模型中,我有一个方法

def self.get_avg_prev_score(id)
  return Scores.calc_score(id)
end

我试图在我的 JSON 哈希中返回 avg_prev_score,但由于它不是数据库中的列,我不知道该怎么做。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 json activerecord include


    【解决方案1】:

    如果您尝试返回所包含的每个课程的平均先前分数,您可以这样做:

    def show
      @user = User.find(params[:id])
      render :text => JSON::parse(@user.to_json(:include=>:classes)).merge("avg_prev_scores" => @user.get_avg_prev_scores_for_classes).to_json
    end
    

    然后让您的其他方法返回与class_id 相关的所有分数的哈希:

    # User.rb model
    def get_avg_prev_scores_for_classes
      average_scores = []
      self.classes.each {|c| average_scores << [c.id, Scores.calc_score(c.id)]}
      return Hash[*average_scores.flatten]
    end
    

    【讨论】:

    • 我认为你很接近,但问题是分数中使用的 id 不是用户 id,所以不是 self.id,它是类 id,用户不知道类 ID。从用户那里调用班级的平均分数也感觉有点奇怪。我尝试调用 classes.id,因为用户有很多类,而不是类,但这也不起作用。不过,我认为您非常接近,感谢您编辑我的问题,我问得很糟糕,我很抱歉。
    • 我用你能做的更新了我的答案。我假设您要返回用户关联的每个班级的所有平均分数,所以我返回一个结构为:class_id =&gt; calculated_score
    • 我不只是得到一个简单的平均值,我在那个函数中做了一些事情。 some_id 来自用户的班级,所以每个用户有很多班级,每个班级都有很多分数。我想我可能需要映射 class_ids 然后合并。这有意义吗??对我来说听起来很难。
    • @pedalpete 首先查看我的更新答案(几分钟前刚刚更新)
    • 只需将两者合并为一个哈希
    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 2013-09-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多