Должен признать, что эти ассоциации кажутся очень странными и лично заставят пересмотреть мой дизайн;Я предполагаю, что это причина, по которой не было много ответов на ваш вопрос.Несмотря на это, я думаю, что это больше суть того, что вы ищете:
models / scene.rb
class Scene < ActiveRecord::Base
has_many :product_images
has_many :products, :through=>:product_images
accepts_nested_attributes_for :products
end
models / product.rb
class Product < ActiveRecord::Base
has_many :product_images
has_many :scenes, :through=>:product_images
accepts_nested_attributes_for :product_images
end
models / product_image.rb
class ProductImage < ActiveRecord::Base
belongs_to :scene
belongs_to :product
end
Я предположил, что сцена - это ваша «родительская» форма, и продукты вложены в каждую сцену, и у каждого продукта есть форма product_image.
views / scenes / _form.html.erb
<%= form_for @scene do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<p>
<%= f.label :background_image %><br />
<%= f.text_field :background_image %>
</p>
<fieldset><legend>Products</legend>
<%= f.fields_for :products do |product_form| %>
<%= render :partial=>"/products/form", :locals => { :f => product_form } %>
<% end %>
</fieldset>
<p><%= f.submit %></p>
<% end %>
views / products / _form.html.erb
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<p>
<%= f.label :price %><br />
<%= f.text_field :price %>
</p>
<p>
<%= f.label :material %><br />
<%= f.text_field :material %>
</p>
<fieldset><legend>Product Images</legend>
<%= f.fields_for :product_images do |pi_form| %>
<%= render :partial=>"/product_images/form", :locals => { :f => pi_form } %>
<% end %>
</fieldset>
views / product_images / _form.html.erb
<p>
<%= f.hidden_field :scene_id %>
<%= f.hidden_field :product_id %>
</p>
<p>
<%= f.label :image %><br />
<%= f.text_field :image %>
</p>
controllers / scenes_controller.rb
def new
@scene = Scene.new
3.times do
@scene.products.build.product_images.build
end
end
def create
@scene = Scene.new(params[:scene])
if @scene.save
redirect_to @scene, :notice => "Successfully created scene."
else
render :action => 'new'
end
end
Я также заметил, что в вашей таблице определено, что таблица product_images показывает столбцы 'scene' и 'product'.Возможно, это просто опечатка, но столбцы должны быть соответственно scene_id и product_id.Удачи!