Rails создают две связанные модели в одном действии New-Create - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть такие модели:

class Doc
  has_many :photos
end

и

class Photo
  belongs_to :doc
end

все фотографии загружены в облако с подходом CarrierWave-Paperclip.

DocController # новый prebuilds Doc с:

@doc = Doc.new

И только после сохранения этого нового документа в действии обновления я действительно могу загрузить фотографии в существующий объект документа с помощью:

@doc.photos << some_new_photo

Но я хочу эту функцию в doc # new action. Итак, как я могу загружать фотографии, например предварительно созданные объекты Photo, и добавлять их в предварительно созданный Doc одновременно с @ doc.photos << [photos]? </p>

UPD:

Основная проблема в том, что когда я делаю doc # new - я не знаю, сколько фотографий я загружу во время использования формы. Итак, у меня есть динамически созданный массив фотографий, которые не следует сохранять в БД, если связанный документ не сохранен /

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

Вы можете использовать несколько запутанную Rails-функцию, называемую accepts_nested_attributes , которая позволяет вам создавать любое количество связанных объектов за один раз.

В основном ваш вызов create в конечном итоге принимает что-то вроде этого:

{ :doc => { :name => 'somname', :date => Time.now, :photos_attributes => [
    { :filename => 'funnybear.gif', :filesize => '120kb' },
    { :filename => 'happybear.gif', :filesize => '72kb'  },
    { :filename => 'angrybear.gif', :filesize => '240kb' }
  ]}}
0 голосов
/ 20 декабря 2011

Или вы можете использовать build:

@doc = Doc.new
params[:photos].each do |some_new_photo|
   @doc.photos.build some_new_photo
end
if @doc.save! 
   ... etc
0 голосов
/ 20 декабря 2011

Вы можете использовать блоки

@doc = Doc.new do |doc|
  doc.photos << some_new_photo
end

или вы можете переопределить метод инициализации

class Doc
 def initialize
   @photos << some_new_photos
 end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...