【问题标题】:Extend Model in Rails在 Rails 中扩展模型
【发布时间】:2015-09-24 17:16:57
【问题描述】:

我正在尝试在 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"    

有人知道我该怎么做吗?

【问题讨论】:

    标签: ruby-on-rails model extend


    【解决方案1】:

    您需要考虑两种可能的模型扩展模式。其中之一,单表继承内置在 Rails 中,是well documented。另一种模式,Multi Table Inheritance,令人惊讶的是在 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
    

    它只是工作。

    【讨论】:

    • 非常感谢@dimakura 的回答,我不使用 STI,因为我希望 SuperUser 拥有比 User 更多的属性。
    • STI @skalgirou 可以为 SU 提供更多属性
    • @skalogirou 你是怎么处理这个问题的?只是好奇。还有哪些其他类型的属性?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 2016-09-06
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多