我有一个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知道如何正确处理这个要求。请帮忙!