Rails / ActiveRecord:保存对模型关联集合的更改

时间:2009-05-15 17:15:26

标签: ruby-on-rails ruby activerecord

我是否必须为模型的集合中的单个项目保存修改,或者在保存模型时是否可以调用它来保存它们。

#save似乎没有这样做。例如:

irb> rental = #...
#=> #<Rental id: 18737, customer_id: 61, dvd_id: 3252, date_rented: "2008-12-16 05:00:00", date_shipped: "2008-12-16 05:00:00", date_returned: "2008-12-22 05:00:00">
irb> rental.dvd
#=> #<Dvd id: 3252, title: "The Women of Summer", year: 1986, copies: 20, is_new: false, is_discontinued: false, list_price: #<BigDecimal:1a48f0c,'0.1599E2',8(8)>, sale_price: #<BigDecimal:1a48ed0,'0.1599E2',8(8)>>
irb> rental.dvd.copies += 1
#=> 21
irb> rental.save
#=> true
irb> rental.dvd
#=> #<Dvd id: 3252, title: "The Women of Summer", year: 1986, copies: 21, is_new: false, is_discontinued: false, list_price: #<BigDecimal:1a2e9cc,'0.1599E2',8(8)>, sale_price: #<BigDecimal:1a2e97c,'0.1599E2',8(8)>>
irb> Dvd.find_by_title('The Women of Summer')
#=> #<Dvd id: 3252, title: "The Women of Summer", year: 1986, copies: 20, is_new: false, is_discontinued: false, list_price: #<BigDecimal:1a30164,'0.1599E2',8(8)>, sale_price: #<BigDecimal:1a30128,'0.1599E2',8(8)>>

在上面的示例中,租借的DVD副本似乎没有更新数据库中的副本(注意副本数量不同)。

5 个答案:

答案 0 :(得分:22)

通过在声明关联时添加:autosave => true选项,可以将ActiveRecord配置为级联保存对模型集合中项目的更改。 Read more

示例:

class Payment < ActiveRecord::Base
    belongs_to :cash_order, :autosave => true
    ...
end

答案 1 :(得分:2)

  

你必须自己做这个

这不完全正确。您可以使用强制保存的“构建”方法。例如,假设您有公司模型和员工(公司has_many员工)。你可以这样做:

acme = Company.new({:name => "Acme, Inc"})
acme.employees.build({:first_name => "John"})
acme.employees.build({:first_name => "Mary"})
acme.employees.build({:first_name => "Sue"})
acme.save

将创建所有4条记录,公司记录和3条Employee记录,并且company_id将被适当地下推到Employee对象。

答案 2 :(得分:2)

只需在增加值后执行rental.dvd.save,或者在上述情况下可以使用

rental.dvd.increment!(:copies)

这也会自动保存,注意'!'增量!

答案 3 :(得分:1)

你必须自己做。 Active Record does not cascade save operations in has_many relations after the initial save.

您可以使用before_save回调自动执行此过程。

答案 4 :(得分:1)

这篇文章很有用: http://erikonrails.snowedin.net/?p=267

Erik描述了如何在模型中使用“accepts_nested_attributes_for”和&lt;%f.fields_for%&gt;为了完成这项工作。

其详细说明可在以下网址找到: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html