2013-03-01 5 views
0

У меня есть три модели - Использование (месяц, элек., Газ), 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 при редактировании существующей записи?

ответ

0

Боже мой! Я потратил целый день, пытаясь понять эту проблему ... Я решил это, изменив «=» в операторах if на «==». Опечатки Feckin!

Смежные вопросы