2010-07-15 34 views
0

我從治療到成本之間有一對多的關係。原因是因爲開發票和稅收的目的,我們需要記錄治療價格的變化。所以這是通過說成本等於與該治療相關的最新成本錄入來實現的。一對多模型更新RoR

此功能需要對用戶完全透明,他們不應該知道任何有關歷史成本的信息,只是有一個最新的。

因此,當他們碰到編輯,並做了更新,如果治療費用改變,我也想更新成本表。我遇到的問題是模型以一種形式表現出來。

<% form_for([:admin, @treatment]) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </p> 
    <p> 
    <%= f.label :description %><br /> 
    <%= f.text_field :description %> 
    </p> 
    <p> 
    <%= f.label :duration %><br /> 
    <%= f.text_field :duration %> 
    </p> 
    <p> 
    <%= f.submit 'Save' %> 
    </p> 
<% end %> 

所以治療has_many:在模型中的成本,並在這種形式,我想成本領域與最新的成本。首先,我該怎麼做?此外,如果成本已更改,我如何更新成本模型?我假設它是在控制器中完成的,但是如果我有一個關於成本的text_field,我該如何解除它與@treatment模型的關聯?

乾杯

回答

0

我也有類似的問題,所以我有我的has_many協會,但後來我有一個has_one協會,指出,最新的版本。

注意:我正在使用MSSQL,因此您的語法可能會有所不同。

class Treatment < ActiveRecord::Base 
    has_many :costs 
    has_one :current_cost, :class_name => "Cost", 
         :conditions => "costs.id = (SELECT MAX(c.id) 
                  FROM costs c 
                  WHERE c.treatment_id = costs.treatment_id)" 
end 

我開始用這樣的:

class Treatment < ActiveRecord::Base 
    has_many :costs 

    def current_cost 
    self.costs.last(:order => "id") 
    end 
end 

之後卻得到了足夠的大,我需要儘量減少數據庫驟降,這正在成爲一個瓶頸。

如果您有能力在成本模型中設置enabled字段並使用驗證來確保每次處理只啓用一項成本。然後我會推薦:

class Treatment < ActiveRecord::Base 
    has_many :costs 
    has_one :current_cost, :class_name => "Cost", :conditions => ["costs.enabled = ?", true] 
end 

我希望這有助於!

+0

在今晚或週末,當我在家時,會有一場狂歡:) – Kezzer 2010-07-16 08:05:59