我有一个从治疗到费用的一对多的关系。这样做的原因是因为为了发票和税收的目的,我们需要记录一种治疗的价格变化。因此,这是通过说成本等于与该治疗相关的最新成本条目来实现的。
这个功能需要对用户完全透明,他们不应该知道任何关于历史成本的事情,只知道有一个当前的成本。
因此,当他们点击编辑,并进行更新时,如果治疗的成本发生变化,那么我也想更新成本表。我遇到的问题是模型以表单的形式表示。
<% 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模型解除关联?
干杯
发布于 2010-07-16 04:14:23
我有一个类似的问题,所以我有我的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
我希望这能帮到你!
https://stackoverflow.com/questions/3258893
复制相似问题