我正在尝试在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"
有谁知道我该怎么做?
答案 0 :(得分:2)
您希望使用单表继承(STI)或多表继承(MTI)。这并不像最初看起来那么复杂。你可以阅读它here
答案 1 :(得分:1)
您需要考虑扩展模型的两种可能模式。其中之一,单表继承内置于Rails中,并且是well documented。另一种模式,多表继承,在Rails中出人意料地受到欢迎。您需要自己实现它或使用较少的popular gem。
我认为,在Rails中不支持MTI的原因之一与性能有关。例如,即使简单的User.find 1
也应该在两个表中进行查找。
你在问题中提出的问题(有两张表)是MTI。但是为什么不在这个简单的情况下STI呢? User
和SuperUser
是否相互偏离,您担心节省空间并为其使用两个单独的表?
对我而言,它似乎只使用一个users
表,并向其添加type
列。
add_column :users, :type, :string
现在:
class User < ActiveRecord::Base
end
class SuperUser < User
end
它只是有效。