Do I have to save modifications to individual items in a collection for a model, or is there a method I can call to save them when I save the model.
#save
doesn't seem to do it. For example:
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)>>
In the above example, the copy of the DVD that the rental has doesn't seem to update the copy in the DB (note the differing number of copies).
You can configure ActiveRecord to cascade-save changes to items in a collection for a model by adding the :autosave => true
option when declaring the association. Read more.
Example:
class Payment < ActiveRecord::Base
belongs_to :cash_order, :autosave => true
...
end
just do a rental.dvd.save after you increment the value or in the above case you could use
rental.dvd.increment!(:copies)
which will also automatically save, note the '!' on increment!
You have to do this yourself
This isnt entirely true. You can use the "build" method which will force a save. For the sake of example assume that you have a Company model and Employees (Company has_many Employees). You could do something like:
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
Would create all 4 records, the Company record and the 3 Employee records and the company_id would be pushed down to the Employee object appropriately.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With