单个 Table 继承和 ActiveRecord 关联
Single Table Inheritance & ActiveRecord Associations
我正在尝试拥有其他模型继承的 parent 模型,以及与第一个模型的 children 关联的辅助 class。这是我目前所拥有的...
我使用第一个命令创建了 parent 模型。
rails g model Person name:string age:integer height:float
然后我将 Person
设置为 parent class,以及两个从它继承的 children class,如下所示。
class Person < ActiveRecord::Base
self.abstract_class = true
end
class Driver < Person
self.table_name = "Driver"
belongs_to :vehicle
end
class Passenger < Person
self.table_name = "Passenger"
belongs_to :vehicle
end
我还设置了一个 Vehicle
class 用于与 Driver
和 Passenger
children class 的关联。
rails g model Vehicle color:string capacity:integer
class Vehicle < ActiveRecord::Base
has_one :driver
has_many :passengers
end
但是,如果我使用 rails 控制台并尝试使用 Driver.new
或 Passenger.new
创建一个新实例 Driver 或 Passenger,我会遇到一个 PostgreSQL错误。
由于我无法弄清楚的原因,Rails 正在编写 SQL 语句来查询 Driver
或 Passenger
table。但是,据我了解,只制作了一个 Person
table 并具有用于查询的 type
属性。
如果有人能在这里提供一些指导,我将不胜感激。
谢谢
由于您似乎正在尝试对 Driver
和 Passenger
使用通用的 table persons
,因此您不需要 abstract_class
声明,或子 类 中的 table_name
声明。根据 rails 文档,当您希望 类 从其父级继承行为时,将使用这些选项,而父级本身没有 table.
下面的代码片段应该可以正常工作。
class Person < ActiveRecord::Base
end
class Driver < Person
belongs_to :vehicle
end
class Passenger < Person
belongs_to :vehicle
end
我正在尝试拥有其他模型继承的 parent 模型,以及与第一个模型的 children 关联的辅助 class。这是我目前所拥有的...
我使用第一个命令创建了 parent 模型。
rails g model Person name:string age:integer height:float
然后我将 Person
设置为 parent class,以及两个从它继承的 children class,如下所示。
class Person < ActiveRecord::Base
self.abstract_class = true
end
class Driver < Person
self.table_name = "Driver"
belongs_to :vehicle
end
class Passenger < Person
self.table_name = "Passenger"
belongs_to :vehicle
end
我还设置了一个 Vehicle
class 用于与 Driver
和 Passenger
children class 的关联。
rails g model Vehicle color:string capacity:integer
class Vehicle < ActiveRecord::Base
has_one :driver
has_many :passengers
end
但是,如果我使用 rails 控制台并尝试使用 Driver.new
或 Passenger.new
创建一个新实例 Driver 或 Passenger,我会遇到一个 PostgreSQL错误。
由于我无法弄清楚的原因,Rails 正在编写 SQL 语句来查询 Driver
或 Passenger
table。但是,据我了解,只制作了一个 Person
table 并具有用于查询的 type
属性。
如果有人能在这里提供一些指导,我将不胜感激。
谢谢
由于您似乎正在尝试对 Driver
和 Passenger
使用通用的 table persons
,因此您不需要 abstract_class
声明,或子 类 中的 table_name
声明。根据 rails 文档,当您希望 类 从其父级继承行为时,将使用这些选项,而父级本身没有 table.
下面的代码片段应该可以正常工作。
class Person < ActiveRecord::Base
end
class Driver < Person
belongs_to :vehicle
end
class Passenger < Person
belongs_to :vehicle
end