首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一对多模型更新RoR

一对多模型更新RoR
EN

Stack Overflow用户
提问于 2010-07-16 02:52:53
回答 1查看 214关注 0票数 0

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

这个功能需要对用户完全透明,他们不应该知道任何关于历史成本的事情,只知道有一个当前的成本。

因此,当他们点击编辑,并进行更新时,如果治疗的成本发生变化,那么我也想更新成本表。我遇到的问题是模型以表单的形式表示。

代码语言:javascript
运行
复制
<% 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模型解除关联?

干杯

EN

回答 1

Stack Overflow用户

发布于 2010-07-16 04:14:23

我有一个类似的问题,所以我有我的has_many关联,但我有一个指向最新版本的has_one关联。

注意:我使用的是MSSQL,所以你的语法可能会有一点不同。

代码语言:javascript
运行
复制
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

我是这样开始的:

代码语言:javascript
运行
复制
class Treatment < ActiveRecord::Base
  has_many :costs

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

但是在它变得足够大之后,我需要最小化数据库的凹陷,这就成为了一个瓶颈。

如果您能够在成本模型中设置enabled字段,并使用验证来确保每个治疗只启用一个成本。然后我会推荐:

代码语言:javascript
运行
复制
class Treatment < ActiveRecord::Base
  has_many :costs
  has_one :current_cost, :class_name => "Cost", :conditions => ["costs.enabled = ?", true]
end

我希望这能帮到你!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3258893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档