【问题标题】:Approaches to sub categories of polymorphic associations in RailsRails 中多态关联子类别的方法
【发布时间】:2011-02-12 05:56:45
【问题描述】:

大家好, 我有一个多态关联,目前正在与几个不同的模型一起使用。每个模型都有与之关联的自己的视频文件,因此它使用“可视频”多态关联。然而,我最近发现需要创建一个具有 2 种不同类型视频的新模型。我会让代码说话。

#current setup
class Video < ActiveRecord::Base
   belongs_to :videoable, :polymorphic => true
end


class Project < ActiveRecord::Base
    has_one :video, :as => videoable
end

# New model I am working on
class Assignment < ActiveRecord::Base
    has_one :video_draft
    has_one :video_final
end

理想情况下,分配模型将具有两种特殊类型的视频对象,同时仍使用多态关联。我考虑过单表继承,但我不确定这是最好的方法。我有哪些选择?我不想创建一个 video_draft 模型和一个 video_final 模型,因为最后它们只是像其他所有东西一样的视频附件。唯一的区别是它们是专门的视频附件,需要自己独特的参考。

【问题讨论】:

    标签: ruby polymorphic-associations unique-constraint


    【解决方案1】:

    您需要做的是在声明 :video_draft 而不是像 Project 模型中的 :video 时告诉 ActiveRecord 您指的是什么模型。这可以通过将:class_name 选项传递给has_one 来完成

    记住这一点,这应该可以正常工作:

    class Assignment < ActiveRecord::Base
        has_one :video_draft, :as => :videoable, :class_name => "Video"
        has_one :video_final, :as => :videoable, :class_name => "Video"
    end
    

    有关需要通过:class_name 的更多信息,请参阅第 4.2.2.3 节中的rails guides

    【讨论】:

    • 这实际上是我的第一个方法。但实际上最终发生的是 :video_draft 和 :video_final 最终指向同一件事。 Video 表有一个“videoable_type”和一个“videoable_id”,它们指向有视频的 ModelName 和 ModelID。
    • 刚刚检查了它执行以下操作:pastebin.com/bVMq0AvN 这是 db 中的结果:pastebin.com/yKP6AV3q 如您所见,创建了两个视频。我不知道为什么它最终会指向同一个对象。也许您可以在 ruby​​ 控制台中运行相同的命令并在此处显示结果?
    • 如果您查看您提供的视频数据库,您应该会发现这两个视频之间没有区别因素。没有什么说一个是草稿,另一个是最终版本。
    • 啊,现在我明白你的意思了。为什么不在视频表中添加布尔 draft(默认为 false)列?然后您可以在 Assignment 模型实例上使用以下内容: assignment.create_video_draft(:draft => true)
    • 另外,您必须更改分配模型中的 has_one 声明。我想像下面这样:has_one :video_draft, :as =&gt; :videoable, :class_name =&gt; "Video", :conditions =&gt; "draft = 1" 这应该可以解决 ActiveRecord 不知道哪条记录是 video_draft 和 video_final 的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多