我有从治疗到成本的一对多关系。这样做的原因是,为了开具发票和税收目的,我们需要记录治疗价格的变化。所以这是通过说成本等于与该治疗相关的最近成本条目来实现的。
此功能需要对用户完全透明,他们不应该了解历史成本,只知道当前的成本。
因此,当他们点击编辑并进行更新时,如果要改变治疗费用,那么我还想更新费用表。我遇到的问题是模型以表格形式表示。
<% 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 :(得分: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
我希望这有帮助!