Я хочу добавить новое вычисленное значение к каждому элементу коллекции, который отображается как render json:
при запросе маршрута API Rails.
Это текущая настройка:
# 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, only: [:ticker, :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, only: [:ticker, :id, :average]
end
Но мне интересно, как бы я это сделал, если бы я хотел избежать массовых вычислений, чтобы обновить добавление базы данных и атрибут :average для каждого пула. Хотя, возможно, это лучшее решение, чем вычисление средних значений для каждого запроса?
попробуйте это в pool.rb, напишите метод, называемый средним, и в этом методе напишите логику,
в индексном методе контроллера напишите так
render json: @pools, only: [:ticker, :id, :average], methods: :average