在 Rails 中扩展模型

ska*_*rou 7 model ruby-on-rails extend

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

模型User使用users数据库中的表,字段为:username, :password

class User < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)

模型 SuperUser 使用super_users数据库中的表和字段:user_id:name

class SuperUser < ActiveRecord::Base
 belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

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

SuperUser.create(:name => "foo", :username => "bar", :password => "foobar")
Run Code Online (Sandbox Code Playgroud)

或者当我获取数据以获得这样的东西时

> s = SuperUser.find 1
> s.username
> "bar"    
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能做到这一点?

dim*_*ura 5

您需要考虑两种可能的模型扩展模式。其中之一,单表继承内置于 Rails 中,并且有很好的文档记录。另一种模式,多表继承,出人意料地在 Rails 中不太受欢迎。您需要自己实现它或使用不太流行的 gem

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

您在问题中提出的问题(有两张桌子)是 MTI。但为什么在这种简单的情况下不是 STI 呢?是UserSuperUser为彼此,你不用担心节省空间和使用两个独立的表为他们偏离?

对我来说,它看起来像使用单个users表,并在其中添加type列。

add_column :users, :type, :string
Run Code Online (Sandbox Code Playgroud)

现在:

class User < ActiveRecord::Base
end

class SuperUser < User
end
Run Code Online (Sandbox Code Playgroud)

它只是有效。


dav*_*rac 4

您需要使用单表继承(STI) 或多表继承(MTI)。这并不像乍看起来那么复杂。你可以在这里读到它