Ruby on rails Rails STI从基类进行条件子分类

Ruby on rails Rails STI从基类进行条件子分类,ruby-on-rails,paperclip,nested-attributes,sti,Ruby On Rails,Paperclip,Nested Attributes,Sti,我正在开发一个项目,我有一个实体,它可能有两种资产:基本上是图片和视频 因为我希望所有的资产都在同一个表上,并且图片或视频都有一个上传表单,所以我使用单表继承,图片和视频都从资产类降序。此外,我将根据是视频还是图片运行不同的验证/回调 我使用回形针来处理上传过程,我的想法是在上传文件并使用它创建资产时,应用程序将根据上传文件的mime类型实例化正确的子类(图片或视频) 这是我的课程简图: class Project < ActiveRecord::Base has_many :asse

我正在开发一个项目,我有一个实体,它可能有两种资产:基本上是图片和视频

因为我希望所有的资产都在同一个表上,并且图片或视频都有一个上传表单,所以我使用单表继承,图片和视频都从资产类降序。此外,我将根据是视频还是图片运行不同的验证/回调

我使用回形针来处理上传过程,我的想法是在上传文件并使用它创建资产时,应用程序将根据上传文件的mime类型实例化正确的子类(图片或视频)

这是我的课程简图:

class Project < ActiveRecord::Base
  has_many :assets
  accepts_nested_attributes_for :assets
end

class Asset < ActiveRecord::Base
  belongs_to :project
  has_uploaded_file :content, ...
end

class Picture < Asset
  validate :image_size
  ...
end

class Video < Asset
  after_save :convert_format
  ...
end
class项目
我的想法是在资产类上保存回调之前实现一个
,并尝试在那里实例化正确的类,但我不确定该怎么做,或者这是一个好主意


你知道这个吗?

虽然你应该喜欢肥胖的模特和瘦小的控制器,但在我看来,这似乎更适合放在控制器中。我的主要理由是,通过在
资产
模型中执行此操作,您将一个基本类型与其子类型耦合,这对我来说是不对的(尽管我看到API一直在这样做).

我会接受这个答案,因为它接近我最终的做法,并为我指明了正确的方向:我放弃了嵌套建模功能,选择手动保存嵌套模型。创建正确子类的“工厂”逻辑确实在项目控制器中,但它可以很容易地移植到它的模型中,我将在完成其余重要内容后立即完成。描述该解决方案的简化代码段可从以下站点获得。