微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rails 为渲染集合的每个元素使用新计算的值渲染 JSON

如何解决Rails 为渲染集合的每个元素使用新计算的值渲染 JSON

我想为集合的每个元素添加一个新计算的值,当查询 Rails API 路由 时,该值呈现为 render json:

这是当前设置:

# app/Models

class User < ApplicationRecord
    has_many :pools,through: :user_pool
end

class Pool < ApplicationRecord
    has_many :users,through: :user_pool
    has_many :stakes

    def average()
        some_kind_of_average(self.stakes)
    end
end
# app/controllers/pool_controller.rb

  def index
    @user = current_user
    @pools = @user.pools
    render json: @pools,only: [:ticker,:id]
  end

我想做的是为 pool 集合的每个 @pools 添加一个 pool.average 值。

应该是这样的:

# app/controllers/pool_controller.rb

  def index
    @user = current_user
    @pools = @user.pools
    render json: @pools,:id,average: @pools.each {|pool| pool.average}]
  end

以上当然行不通,实现我的目标最优雅的方式是什么?

我能想到的唯一方法是计算所有的平均先前查询,并将其作为Pool的新属性插入到数据库中,这样控制器就会简单地变成:

# app/controllers/pool_controller.rb

  def index
    @user = current_user
    @pools = @user.pools
    render json: @pools,:average]
  end

但我想知道如果我想避免大规模计算来更新每个池的数据库添加和 :average 属性,我该怎么做。即使可能是最好的解决方案,而不是计算每个查询的平均值?

解决方法

尝试在 pool.rb 中编写一个名为 average 的方法,然后在该方法中编写逻辑,

在controller的index方法中这样写

render json: @pools,only: [:ticker,:id,:average],methods: :average

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?