创建一个破坏has_many关联的表单?

时间:2013-01-27 08:42:34

标签: ruby-on-rails ruby ruby-on-rails-3 polymorphism

正如我在之前的帖子rails has_many manager中所提到的,我正在尝试创建一个多态成像系统,该系统将允许任何项目继承具有封面照片和其他照片的能力。

为了实现这种成像系统,我支持使用belongs_to:imageable的多态模型,并将其活动记录功能扩展到名为Imageable的模块。

我的主要问题是,假设我们有一个名为Object的类,我怎样才能创建一个只针对第一个Object的has_many关联(封面)的表单,然后单独管理其他has_many关联?

表单看起来像..

---封面照片----

对象[image_attributes] [0] [public_id]

的上传按钮

---附加照片的表格---

对象的上传按钮[image_attributes [1] [public_id]

image.rb

class Image < ActiveRecord::Base

  attr_accessible :public_id

  # Setup the interface that models will use
  belongs_to :imageable, :polymorphic => true
end

Imageable.rb

module Imageable
  extend ActiveSupport::Concern

  included do
    has_many :images, :as => :imageable, :dependent => :destroy # remove this from your     model file
    accepts_nested_attributes_for :images

    validates :images, :presence => { :message => "At least one image is required" }
  end

  def cover
    cover = images.where(:cover => true).first
    if not cover
        return Image.new
    end
    return cover
  end

  def additional_images
    images.where(:cover => false).all
  end

end

表格

<%= form.semantic_fields_for :images do |image_fields| %>

    <%= image_fields.cl_image_upload(:public_id, :crop => :limit, :width => 1000, :height => 1000, 
                      :html => {:class => "cloudinary-fileupload"}) %> 
    ...

以上产生适当的路线,如object [image_attributes] [0] [public_id]

谢谢!

1 个答案:

答案 0 :(得分:0)

我建议您通过使用从“对象”到封面Imageable的显式has_one关系以及其他图像的单独has_many关系来略微区别对关系进行建模。

如果您想要同一个系列中的所有图片,请查看此帖子: How to apply a scope to an association when using fields_for? 它解释了在设置fields_for帮助程序时如何指定has_many集合中条目的“范围”或子集。它应该与semantic_fields_for帮助器一起工作,因为它只是包装Rails fields_for帮助器。