У меня есть три модели - Использование (месяц, элек., Газ), Project (тип_ты_пакеты, date_implemented, manual_elec_savings, manual_gas_savings) и month_project_savings (elec, gas, usage_id, project_id). Ассоциации устанавливаются следующим образом:Rails 3 - Рассчитать атрибут модели, основанный на атрибуте соответствующей модели
Project has_many :monthly_project_savings,
has_many :usages, through :monthly_project_savings
Usage has_many :monthly_project_savings
has_many :projects, through :monthly_project_savings
monthly_project_saving belongs_to :usage, :project
У меня есть метод в моей модели проекта, так что после того, как проект будет сохранен, он вычисляет связанные monthly_project_savings на основе project_type:
def calc_monthly_project_saving
//destroy all previous records
self.monthly_project_saving.destroy_all
//calculate monthly savings
Usage.all.each do |u|
if self.project_type = "General" && self.date_implemented <= u.month
self.monthly_project_savings.create(usage_id: u.id, elec: self.manual_elec_savings, gas: self.manual_gas_savings)
elsif self.project_type="Elec" && self.date_implemented <= u.month
self.monthly_project_savings.create(usage_id: u.id, elec: u.elec, gas:0)
elsif self.project_type="Gas" && self.date_implemented <= u.month
self.monthly_project_savings.create(usage_id: u.id, elec: 0, gas:u.gas)
end
end
end
I затем назовите его, используя after_save :calc_monthly_project_saving
.
Моя проблема заключается в том, что если я вызову метод с использованием «after_save», первый оператор if всегда будет иметь значение true, даже если project_type отличается. Кроме того, если я сменил первый self.monthly_project_savings.create(elec:)
от self.manual_elec_savings
до u.elec
, он возвращает month_project_savings как elec.
Если я изменю его на вызов before_save, он выдаст ошибку: "You cannot call create unless the parent is saved"
, что имеет смысл. Хотя он будет работать таким образом при редактировании существующих записей проекта, но иногда date_implemented будет изменяться на «t» или «f». Я понятия не имею, как это сделать, помогите?
Также как в стороне, почему рельсы устанавливают значение date_implemented на «f», если я вызываю метод before_save при редактировании существующей записи?