0

在 Rails 应用程序中,我有一个这样的基本模型:

class User < ActiveRecord::Base
  attr_accessible :email, :name
end

从这个模型继承,像这样:

class Provider < User
  belongs_to :user

  attr_accessible :business_name, :contact_name, :business_phone_number,
    :business_email, :website, :user_id
end

当我做 :

Provider.new.user_id

它说NoMethodError: undefined method 'user_id' for #<Provider:0x007f63ec8b3790>

当我这样做时,Provider.new我有这个:

#<Provider id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, type: "Provider">

这是我的 schema.rb 的一部分:

  create_table "providers", :force => true do |t|
    t.string  "business_name",         :null => false
    t.string  "contact_name",          :null => false
    t.string  "business_phone_number", :null => false
    t.string  "business_email",        :null => false
    t.string  "website"
    t.integer "user_id"
  end

  create_table "users", :force => true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at",                             :null => false
    t.datetime "updated_at",                             :null => false
  end

如您所见,Provider 的可访问属性是不可访问的。你有解决方案吗?

谢谢!

4

2 回答 2

2

正如在 Single Table Inheritance 的答案中讨论的那样,引用具有自己的字段的子类ActiveRecordSingle Table Inheritance 的实现不涉及附加表。所有子类共享同一个表,并依靠一个type字段来标识子类。这就解释了为什么您的Provider实例只包含users表中可用的字段,包括typeRails 为子类化支持添加的字段。您的providers表未使用。

于 2013-11-09T14:51:29.077 回答
0

在数据库级别使用同一个表。STI 是通过向现有表中添加新列来实现的。通常命名为“类型”的新列用于保存信息是“提供者”还是“用户”

以下是模型查询如何转换为 sql 查询

当查询用户模型时,根据您的示例,它会搜索“用户”表并在条件中包含所有可用的类型值

> User.first
SELECT  `users`.* FROM `users`  WHERE `users`.`type` IN ('User', 'Provider')  ORDER BY `users`.`id` ASC LIMIT 1

查询 Provider 模型时,条件中的 type 设置为“Provider”,因此结果会被过滤。底层数据库表保持不变,即“用户”

 > Provider.first
SELECT  `users`.* FROM `users`  WHERE `users`.`type` IN ('Provider')  ORDER BY `users`.`id` ASC LIMIT 1
于 2017-11-14T12:26:24.470 回答