Ruby Rails计算查询中使用的属性

时间:2017-04-04 06:15:53

标签: ruby-on-rails ruby activerecord

我有一个has_many通过关联,以便FullApplication通过FullApplicationDistricts有很多区域,而我的应用程序表有许多用于存储货币的bigit列。我需要跟踪每个应用程序的其他金额,这些金额是存储金额的计算,似乎为那些创建单独的数据库列并在每次更新应用程序时更新都不理想,而是我应该创建用于返回计算值的Application类方法。但是,我需要运行查询以按区分组的那些计算量的总和,并且我遇到错误,例如“calculated_value_one”不是表中的列。我目前的代码:

模型:

class FullApplication < ApplicationRecord
  has_many :fullapplication_districts, inverse_of: :full_application, dependent: :destroy
  has_many :districts, through: :fullapplication_districts

  accepts_nested_attributes_for :fullapplication_districts

  def calculated_value_one
    return self.value_one + self.value_two + self.value_three
  end
end

class FullapplicationDistrict < ApplicationRecord
  belongs_to :full_application
  belongs_to :district

  validates_presence_of :full_application, :district
end

class District < ApplicationRecord
  has_many :fullapplication_districts, inverse_of: :district, dependent: :destroy
  has_many :full_applications, through: :fullapplication_districts
end

我需要的查询应该返回按区域分组的calculated_value_one的总和。我一直在尝试各种各样的查询,但无济于事。

FullApplication.joins(:districts).select("districts.name").distinct.where("full_applications.status_id IN (?)",[1,10]).group("districts.name").sum(:calculated_value_one) 

从我在网上找到的内容看起来似乎这可能是不可能的,因为链接被转换为纯SQL。所以我从那里开始使用attr_accessor,如:

class FullApplication < ApplicationRecord
  ...
  attr_accessor :calculated_value_one
  after_commit :set_calculated_value_one

但是我也无法做到这一点。 FullApplication.find(1).calculated_value_one始终在控制台中返回nil。最后,我尝试为calculated_value_one创建一个实际的db列,并因此设置其计算值:

class FullApplication < ApplicationRecord
  ...
  after_commit :set_calculated_value_one
  def calculated_value_one
    self.update(calculated_value_one: value_one + self.value_two + self.value_three)
  end

但是这导致stack level too deep错误(我猜是递归更新?)。在这一点上,我知道我只是不知道足够的Ruby和Rails知道如何正确处理这个要求。请帮忙!

0 个答案:

没有答案