Несколько вложенных acceptpts_nested_attributes и разница между «сохранить» и «создать» - PullRequest
0 голосов
/ 15 ноября 2011

У меня возникают проблемы с пониманием того, почему "save" и "create" должны отличаться при использовании этих моделей с accepts_nested_attributes_for. Это мои модели:

class Book < ActiveRecord::Base
  has_many :pages
  has_many :picture_pages, :through => :pages, :source => :pagetype, :source_type => 'PicturePage'
  accepts_nested_attributes_for :picture_pages
end

class PicturePage < ActiveRecord::Base
  has_one :page, :as =>:pagetype
  has_one :book, :through => :pages
  accepts_nested_attributes_for :page
end

class Page < ActiveRecord::Base
  belongs_to :book
  belongs_to :pagetype, :polymorphic => true, :dependent => :destroy
end

Прежде всего, используя метод сохранения ....

b = Book.first
params = { "page_attributes"=> { "number"=>"1" }}
p = b.picture_pages.new(params)
p.save

... все работает так, как вы ожидаете. Rails автоматически создаст новый PicturePage с соответствующей моделью объединения страниц с назначенным атрибутом «число». Отлично. Но если я сделаю это:

b = Book.first
params = { "page_attributes"=> { "number"=>"1" }}
p = b.picture_pages.create(params)

... Rails создаст ДВЕ модели соединения, одна из которых будет полностью пустой, а другая с атрибутом числа. Почему это?

Это серьезная проблема, если я хочу использовать accepts_nested_attributes_for для модели книги, потому что тогда модель Book автоматически вызовет «создание» в моделях PicturePage, которые она создает.

Какие-нибудь советы? Это ошибка в Rails?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

У вас здесь много чего происходит:

  • has_many: через 's
  • два принимают вложенные атрибуты, идущие в обе стороны
  • полиморфная ассоциация

Мой совет (как вы и просили) - ловко решать эти вопросы один за другим.Получите каждый кусок, работающий для создания, редактирования и просмотра, прежде чем делать следующее.Это поможет вам значительно продвинуться вперед.

  • Сначала выполните работу has_many.
  • Затем включите вложенные атрибуты - и начните с одного nested_attributes.
  • Наконец, работайте над полиморфными ассоциациями, но обратите внимание, что многие люди избегают или отказываются от полиморфных ассоциаций, поскольку некоторые из них являются нервными, несмотря на кажущуюся простоту.Я не рекомендую их для новичков в рельсах, особенно если их объединить следующим образом.

И последнее замечание: этот материал не будет иметь большого смысла, если вы сначала немного не прочитаете / не изучите рельсы и неЕсть много веб-ресурсов для этого.

Я бы попробовал начать что-то вроде этого:

class Book < ActiveRecord::Base
  has_many :page_pictures
  has_many :pictures, :through => :page_pictures
end

class PagePicture < ActiveRecord::Base
  belongs_to :book
  belongs_to :picture
end

class Picture < ActiveRecord::Base
  has_many :page_pictures
  has_many :books, :through => :page_pictures
end

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

0 голосов
/ 23 ноября 2011

create: создает объект (или несколько объектов) и сохраняет его в базе данных.

save: если модель новая, в базе данных создается запись, в противном случае - существующая записьupdated.

По сути, вы не можете обновить конкретную запись с помощью create, но с помощью save вы можете.Но для новой записи могут использоваться оба варианта, это зависит от того, хотите ли вы сделать это в одной строке кода или в двух.

...