Ruby 继承 - child 实例只有 parent 个属性

Ruby inheritance - child instance has only parent attributes

这是我第一次使用Ruby subclass 继承。 我有一个 parent class A 属性 "name:string", 和 child class B < A 具有属性 "bankname:string".

当我使用 rails 控制台创建 B 实例 (B.new) 时,我得到一个 object 只有 "name:string",没有 "bankname:string"属性。

我的架构如下所示:

 create_table "a", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "b", force: :cascade do |t|
    t.string   "bankname"
    t.datetime "created_at",     null: false
    t.datetime "updated_at",     null: false
  end

我的模型是:

class A < ApplicationRecord
end

class B < A
end

控制台:

2.4.0 :010 > c = B.new
 => #<B id: nil, name: nil, created_at: nil, updated_at: nil>

在 Ruby 中,如果您使用 Single Table Inheritance,您实际上只能从另一个 class 继承,这两种类型共享一个共同的 table 和 table 有一个字符串 type 列。

由于您声明 BA 的子 class,ActiveRecord 认为这意味着 b table 是无关紧要的, B 使用 A table.

您需要的是:

create_table "a", force: :cascade do |t|
  t.string "type"
  t.string "name"
  t.string "bankname"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

现在您可以在哪里容纳 STI。请注意,所有列对所有模型都是可见的,但您可以将 "bankname" 设置为 A 的可选项,或者忽略它,不使用它。