在Rails中扩展模型

时间:2015-09-24 17:16:57

标签: ruby-on-rails model extend

我正在尝试在rails中扩展模型。

模型User使用数据库中的表格users,其中包含字段:username:password

class User < ActiveRecord::Base
end

模型超级用户在数据库中使用表super_users,其中包含字段:user_id:name

class SuperUser < ActiveRecord::Base
 belongs_to :user
end

我希望SuperUser成为User的扩展名,以便能够做到这一点:

SuperUser.create(:name => "foo", :username => "bar", :password => "foobar")

或当我获取数据以获得类似的内容时

> s = SuperUser.find 1
> s.username
> "bar"    

有谁知道我该怎么做?

2 个答案:

答案 0 :(得分:2)

您希望使用单表继承(STI)或多表继承(MTI)。这并不像最初看起来那么复杂。你可以阅读它here

答案 1 :(得分:1)

您需要考虑扩展模型的两种可能模式。其中之一,单表继承内置于Rails中,并且是well documented。另一种模式,多表继承,在Rails中出人意料地受到欢迎。您需要自己实现它或使用较少的popular gem

我认为,在Rails中不支持MTI的原因之一与性能有关。例如,即使简单的User.find 1也应该在两个表中进行查找。

你在问题​​中提出的问题(有两张表)是MTI。但是为什么不在这个简单的情况下STI呢? UserSuperUser是否相互偏离,您担心节省空间并为其使用两个单独的表?

对我而言,它似乎只使用一个users表,并向其添加type列。

add_column :users, :type, :string

现在:

class User < ActiveRecord::Base
end

class SuperUser < User
end

它只是有效。