【问题标题】:Single Table Inheritance or Polymorphic?单表继承还是多态?
【发布时间】:2015-07-20 05:13:58
【问题描述】:

所以我有一个看起来像这样的数据库结构:

事件:

event_id: :integer
event_type: :string
name: :string
slug: :string
user_id: :integer
start: :datetime
finish: :datetime

我需要从事件继承的婚礼:

bride_name: :string
groom_name: :string
street: :string
city: :string
state: :string
zip: :integer
receptions: :text

我希望能够创建一个婚礼或任何其他事件,并让它继承事件模型中所有事件的共同特征。当我尝试使用 STI 执行此操作时,Wedding 模型仅具有 Event 模型的特征。我该如何实现?

这不起作用

class Wedding < Event

  attr_accessor :receptions, :reception_name, :reception_address, :reception_city, :reception_state, :reception_zip

end

【问题讨论】:

  • 在 Rails 的 STI 表中是否有 type 列来保存事件的类型?您的列表中似乎缺少。
  • 是的,当我尝试 STI 时,我做到了。我列出的是我想要的结构。即使我有一个类型列,它也只是创建了一个具有事件模型属性的对象
  • 您不需要任何attr_accessor 语句来访问模型中的属性。它可以使阅读更容易。拥有一个type 列(具有适当的内容)并在Ruby 代码中继承就足以让STI 工作。如果你想要MTI,你可以试试github.com/hzamani/active_record-acts_as
  • @ma_il 请给出答案,以便我接受!我不知道有这样的宝石存在!另外我不需要属性访问器来获取不在我的数据库中的值吗?我作为属性访问器放置的所有东西我打算变成一个数组并插入到数据库的一部分中
  • 我刚刚看到您的数据库中有一个字段 receptions 以及一个 attr_accessor 调用,后者是多余的。

标签: ruby-on-rails ruby activerecord polymorphism single-table-inheritance


【解决方案1】:

由于 Rails 只支持开箱即用的 STI,如果你真的想要 MTI,你可以试试 ActiveRecord::ActsAs gem。

他们的跟踪器中有几个未解决的问题,但开发似乎有些活跃。

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 2011-05-23
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    相关资源
    最近更新 更多