一对多模型更新RoR

时间:2010-07-15 18:52:53

标签: ruby-on-rails

我有从治疗到成本的一对多关系。这样做的原因是,为了开具发票和税收目的,我们需要记录治疗价格的变化。所以这是通过说成本等于与该治疗相关的最近成本条目来实现的。

此功能需要对用户完全透明,他们不应该了解历史成本,只知道当前的成本。

因此,当他们点击编辑并进行更新时,如果要改变治疗费用,那么我还想更新费用表。我遇到的问题是模型以表格形式表示。

<% 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模型解除关联?

干杯

1 个答案:

答案 0 :(得分: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

我希望这有帮助!