【问题标题】:Rails STI conditional sub-classing from base class来自基类的 Rails STI 条件子类化
【发布时间】:2010-12-20 23:45:15
【问题描述】:

我正在开发一个项目,其中我有一个可能有两种资产的实体:图片视频,基本上。

由于我希望所有资产都在同一个表上,并且 图片视频 都在一个上传表单上,所以我使用的是具有两者的单表继承 Picture 和 Video 来自 Asset 类。此外,我将根据是视频还是图片运行不同的验证/回调。

我正在使用回形针来处理上传过程,我的想法是在上传文件并使用它创建资产时,应用程序将实例化正确的子类(图片视频)取决于上传文件的 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

我的想法是在 Asset 类上实现一个before_save 回调并尝试在那里实例化正确的类,但我不确定如何去做,或者这是否是个好主意。

对此有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails paperclip nested-attributes sti


    【解决方案1】:

    虽然您应该更喜欢胖模型和瘦控制器,但对我来说,这似乎更好地放置在控制器中。我的主要理由是,通过在您的 Asset 模型中执行此操作,您将基类型耦合到其子类型,这对我来说感觉不对(尽管我看到 API 一直这样做)。

    【讨论】:

    • 我会接受这个答案,因为它接近我最终所做的并为我指明了正确的方向:我放弃了嵌套建模功能并选择手动保存嵌套模型。创建正确子类的“工厂”逻辑确实在 Project 控制器中,但它可以很容易地移植到它的模型中,我将在完成其余重要内容后立即执行此操作。描述该解决方案的简化 sn-p 可在 pastie.org/1522024 获得。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多