【问题标题】:Rails Model InheritanceRails 模型继承
【发布时间】:2011-06-21 17:50:58
【问题描述】:

如果我有一个用户,并且我想创建不同类型的用户,比如只有一个电子邮件的普通用户和拥有网站字段的订阅者,我如何让订阅者从只添加一个字段的用户那里继承所有内容?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    您需要创建一个包含所有字段的表,并指定一个类型列。 即

    create_table :users do |t|
      t.string :email
      t.string :website
      t.string :type
    end
    

    然后你可以有像这样的类

    Class User < ActiveRecord::Base
    
    Class Subscriber < User
    

    订阅者将继承用户模型的所有内容。类型列在那里,以便您可以区分不同的模型。例如使用

    Subscriber.all 
    

    只会获得订阅者,如果您没有使用“类型”列,它也会找到用户。

    【讨论】:

    • OP:这称为“单表继承”或“STI”。因此,如果您需要,请在 Google 上获取有关其工作原理的更多信息。
    • 在对该主题进行了相当多的谷歌搜索之后,当模型之间的数据不同时,有些人似乎也更喜欢使用多态关联。这避免了一个包含大量空字段的表。我发现这个 railscast 很有帮助:railscasts.com/episodes/394-sti-and-polymorphic-associations.
    • type列应该有什么实际值?
    • @MichaelDurrant 您是指数据库中的内容吗?它将是它所引用的类的名称。因此,在示例中,您将字符串“用户”和“订阅者”作为类型字段中的值
    • @Olives 我有价值 nil 如果“用户”和Subscriber 如果订阅者在类型列中
    【解决方案2】:

    你想要single table inheritance,Alex Reisner 在链接中描述。 STI 使用单个表来表示从基本模型继承的多个模型。在 Rails 世界中,数据库模式有一个列,该列指定由该行表示的模型类型。在数据库迁移中添加名为type 的列会使Rails 推断该表使用STI,尽管如果您在数据模型中指定名称,该列可以是任意名称(参见class method 'inheritance_column')。请注意,这会使type 成为保留字。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • @Luke:只要“单表继承”是答案,那不完全是仅链接。
    • @NathanTuggy 正如您将在 Olives 的回答中看到的那样,提供一个简单的示例确实是这里的首选结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多