Rails / ActiveRecord: сохранить изменения в связанных коллекциях модели - PullRequest
7 голосов
/ 15 мая 2009

Нужно ли сохранять модификации отдельных элементов в коллекции для модели или есть метод, который я могу вызвать, чтобы сохранить их при сохранении модели.

#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 ]

22 голосов
/ 25 апреля 2012

Можно настроить ActiveRecord для каскадного сохранения изменений элементов в коллекции для модели, добавив параметр :autosave => true при объявлении связи. Читать дальше .

Пример:

class Payment < ActiveRecord::Base
    belongs_to :cash_order, :autosave => true
    ...
end
2 голосов
/ 15 мая 2009

Вы должны сделать это сами

Это не совсем так. Вы можете использовать метод "build", который заставит сохранить. Для примера предположим, что у вас есть Модель компании и Сотрудники (Компания 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 записи, запись Company и 3 записи Employee, а company_id будет соответственно перемещен в объект Employee.

2 голосов
/ 15 мая 2009

просто сделайте rental.dvd.save после увеличения значения или в приведенном выше случае вы можете использовать

rental.dvd.increment!(:copies)

, который также будет автоматически сохранен, обратите внимание на '!' с шагом!

1 голос
/ 06 июля 2012

Этот пост может быть полезен: http://erikonrails.snowedin.net/?p=267

Эрик описывает, как использовать «accepts_nested_attributes_for» в модели и <% f.fields_for%> в представлении для выполнения работы.

Его подробное описание можно найти в: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

1 голос
/ 15 мая 2009

Ты должен сделать это сам. Active Record не выполняет каскадные операции сохранения в отношениях has_many после первоначального сохранения.

Вы можете автоматизировать процесс с помощью обратного вызова before_save.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...