使用ONE表单的Rails STI

Rab*_*ott 6 polymorphism ruby-on-rails single-table-inheritance

我有一个表单,允许我将不同格式的文件添加到流.因此,流由许多文件组成,这些文件是XML文件,但基本上有不同的模式.我有一个表单允许用户添加他们想要的任何文件,我正在使用STI(当数据已经在表中时效果很好),我的麻烦是将数据添加到表中.

表单有1个输入字段,只有一个file_field,允许用户选择要上传的文件.由于我只有一个表单,我无法实例化正确的对象,我必须以编程方式进行...而且我不知道该怎么做.

我只是(或者我可以)添加可能类型的下拉列表,并调用该字段'type',以便在提交表单时,rails将实例化对象的写入类型,因为提供了type属性?

这是什么最好的做法..我正在运行rails 2.3.4.

Rab*_*ott 3

我在http://coderrr.wordpress.com/2008/04/22/building-the-right-class-with-sti-in-rails/#comment-1826找到了解决方案

class GenericClass < ActiveRecord::Base
  class << self
    def new_with_cast(*a, &b)
      if (h = a.first).is_a? Hash and (type = h[:type] || h['type']) and (klass = type.constantize) != self
        raise "wtF hax!!"  unless klass < self  # klass should be a descendant of us
        return klass.new(*a, &b)
      end

      new_without_cast(*a, &b)
    end
    alias_method_chain :new, :cast
  end
end
Run Code Online (Sandbox Code Playgroud)

这对我来说用最少的代码工作得很好 - 我不知道它是否很黑客,但它有效,而且相当干净。我喜欢它只有 10 行左右的代码。