Rails在一个New-Create操作中创建两个关联模型

时间:2011-12-20 11:40:47

标签: ruby-on-rails ruby forms

我有这样的模特:

class Doc
  has_many :photos
end

class Photo
  belongs_to :doc
end

使用CarrierWave-Paperclip方式将所有照片上传到云端。

DocController #new prebuilds Doc with:

@doc = Doc.new

只有在保存这个新文档后,在更新操作中我才能真正将照片上传到现有的Doc对象:

@doc.photos << some_new_photo

但我想在doc#new action中使用此功能。那么,我如何上传像prebuilded Photo对象的照片,并将它们添加到prebuilded Doc with @ doc.photos&lt;&lt; [照片]同时?

UPD:

主要问题,当我制作doc#new时 - 我真的不知道在使用表单时我会上传多少张照片。因此,如果关联的Doc未保存/

,我已动态构建了不应保存到数据库的照片数组

3 个答案:

答案 0 :(得分:1)

您可以使用一个名为accepts_nested_attributes的有点复杂的Rails功能,它允许您一次创建任意数量的关联对象。

基本上你的创建调用最终会接受这样的内容:

{ :doc => { :name => 'somname', :date => Time.now, :photos_attributes => [
    { :filename => 'funnybear.gif', :filesize => '120kb' },
    { :filename => 'happybear.gif', :filesize => '72kb'  },
    { :filename => 'angrybear.gif', :filesize => '240kb' }
  ]}}

答案 1 :(得分:0)

您可以使用块

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

或者您可以重新定义初始化方法

class Doc
 def initialize
   @photos << some_new_photos
 end
end

答案 2 :(得分:0)

或者你可以使用build:

@doc = Doc.new
params[:photos].each do |some_new_photo|
   @doc.photos.build some_new_photo
end
if @doc.save! 
   ... etc