如何解决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 举报,一经查实,本站将立刻删除。