Ruby on rails 如何利用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
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