Ruby on rails 如何利用rails中的继承获得多态关系?

Ruby on rails 如何利用rails中的继承获得多态关系?,ruby-on-rails,ruby,activerecord,polymorphism,Ruby On Rails,Ruby,Activerecord,Polymorphism,我有以下rails型号 class Service < ApplicationRecord self.table_name ='service' end class ChildA < Service has_many :charges end class ChildB < Service self.table_name = "childb_table" has_many :charges end class Charges < Application

我有以下rails型号

class Service < ApplicationRecord
  self.table_name ='service'
end

class ChildA < Service
  has_many :charges
end

class ChildB < Service
  self.table_name = "childb_table"
  has_many :charges
end

class Charges < ApplicationRecord
  :belongs_to chargeable, polymorphic: true
end
# code using this
a = ClassB.new.save
charge = Charges.new.save
a.charges.add(a) # this adds the column with the class name 'Service'
类服务
我试图保存对象,但
计费类型
字段始终设置为基类
服务
而非子类


我该怎么做

我认为解决方案在于:

将多态关联与单个表结合使用 继承(STI)有点棘手。为了让这些协会 按预期工作,确保存储STI的基本模型 多态关联的类型列中的模型。继续 在上面的资产示例中,假设有来宾帖子和成员帖子 使用STI的posts表的POST。在这种情况下,必须有一个 在posts表中键入列

注意:分配时将调用attachable_type=方法 可附加的。可附加类的类名称作为字符串传递

class资产
我认为解决方案在于:

将多态关联与单个表结合使用 继承(STI)有点棘手。为了让这些协会 按预期工作,确保存储STI的基本模型 多态关联的类型列中的模型。继续 在上面的资产示例中,假设有来宾帖子和成员帖子 使用STI的posts表的POST。在这种情况下,必须有一个 在posts表中键入列

注意:分配时将调用attachable_type=方法 可附加的。可附加类的类名称作为字符串传递

class资产
您可以将
服务
类定义为抽象类

使用Rails 5.1进行测试

class Service < ApplicationRecord
  self.table_name ='service'
  self.abstract_class = true
end
类服务
示例来自:

class超类
您可以将
服务
类定义为抽象类

使用Rails 5.1进行测试

class Service < ApplicationRecord
  self.table_name ='service'
  self.abstract_class = true
end
类服务
示例来自:

class超类
:has_许多费用
行不应该是
has_许多:费用
?(与
属于
行相同)同样,我也不完全确定这里发生了什么。您正在尝试保存哪个对象?你能显示你用来保存对象的代码吗?我不能确定粘贴在这里的内容,但您可能正在寻找STI()。是否应该将
:has_many charges
行设置为
has_many:charges
?(与
属于
行相同)同样,我也不完全确定这里发生了什么。您正在尝试保存哪个对象?你能显示你用来保存对象的代码吗?我不能确定粘贴在这里的内容,但您可能正在寻找STI()。可附加类型始终使用基本类名称调用,我希望使用当前类名(例如“GuestPost”)调用它,然后覆盖每个子类中的
attachable\u type=
方法,并让它返回您想要的类名。确定。为什么ChildB从服务继承?是否可以将共享功能移动到模块或关注点,并避免使用继承?我可以将其移动到关注点,但这是一个巨大的重构。正在寻找一种不这样做的方法。attachable类型总是用base_类名调用,我希望使用当前类名(例如“GuestPost”)调用它,然后覆盖每个子类中的
attachable_type=
方法,并让它返回您想要的类名。确定。为什么ChildB从服务继承?是否可以将共享功能移动到模块或关注点,并避免使用继承?我可以将其移动到关注点,但这是一个巨大的重构。寻找一种不用那样做的方法。
class SuperClass < ActiveRecord::Base
  self.abstract_class = true
end

class Child < SuperClass
  self.table_name = 'the_table_i_really_want'
end