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
列。
由于您声明 B
是 A
的子 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 的可选项,或者忽略它,不使用它。
这是我第一次使用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
列。
由于您声明 B
是 A
的子 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 的可选项,或者忽略它,不使用它。