2010-07-15 62 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