Rails模型继承

Dud*_*mes 22 activerecord ruby-on-rails

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

Oli*_*ves 26

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

create_table :users do |t|
  t.string :email
  t.string :website
  t.string :type
end
Run Code Online (Sandbox Code Playgroud)

然后你可以有像这样的课程

Class User < ActiveRecord::Base

Class Subscriber < User
Run Code Online (Sandbox Code Playgroud)

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

Subscriber.all 
Run Code Online (Sandbox Code Playgroud)

只会获得订阅者,就好像你没有使用'type'列一样,它也会找到用户.

  • OP:这称为"单表继承"或"STI".谷歌,如果你需要它的更多信息,如何它的工作原理. (21认同)
  • 在对该主题进行了大量的谷歌搜索之后,当模型之间的数据不同时,一些人似乎更喜欢使用多态关联.这避免了具有大量空字段的单个表.我发现这个railscast很有帮助:http://railscasts.com/episodes/394-sti-and-polymorphic-associations. (4认同)

Fre*_*red 13

您需要单表继承,由Alex Reisner在链接中描述.STI使用单个表来表示从基础模型继承的多个模型.在Rails世界中,数据库模式有一个列,用于指定行所表示的模型类型.添加type在数据库迁移中命名的列有Rails推断该表使用STI,尽管如果在数据模型中指定名称,该列可以是任意名称(请参阅类方法'inheritance_column').请注意,这是type一个保留字.

  • 那破了.我想正确的链接是[http://www.alexreisner.com/code/single-table-inheritance-in-rails](http://www.alexreisner.com/code/single-table-inheritance-in-rails ) (2认同)