Ruby on rails 单表继承:可选插件模块和迁移

Ruby on rails 单表继承:可选插件模块和迁移,ruby-on-rails,database-migration,single-table-inheritance,Ruby On Rails,Database Migration,Single Table Inheritance,我想知道如何使用ruby on rails解决这个问题: 有一个核心模块提供一个类BasePlugin 可选插件从这个基类继承(单表继承) 示例:来自FooPlugin模块的FooPlugin是一个外部可选模块(由第三方提供) 由于使用了STI,因此FooPlugin的迁移需要驻留在FooPlugin模块中 结果:BasePlugin不知道它的整个表,因为可选的外部模块会添加额外的列 我是RubyonRails新手,但多年来一直在用不同的语言开发基于数据库的应用程序 问题: 在ruby on r

我想知道如何使用ruby on rails解决这个问题:

有一个核心模块提供一个类
BasePlugin

可选插件从这个基类继承(单表继承)

示例:来自FooPlugin模块的
FooPlugin
是一个外部可选模块(由第三方提供)

由于使用了STI,因此
FooPlugin
的迁移需要驻留在FooPlugin模块中

结果:BasePlugin不知道它的整个表,因为可选的外部模块会添加额外的列

我是RubyonRails新手,但多年来一直在用不同的语言开发基于数据库的应用程序

问题:


在ruby on rails中是否可以使用上述STI?

STI表包含父模型和所有子模型的所有属性的交集。注意,在STI中,BasePlugin是一个模型,而不是一个模块。外部插件通常作为gem提供


但关键是BasePlugin不需要在第一次创建时定义它的所有属性。如果以后添加FooPlugin子级并使用迁移将列添加到base_plugins表以向FooPlugin添加属性,BasePlugin将能够看到这些列。ActiveRecord在启动时使用内省将数据库列填充到ActiveRecord对象中,因此
BasePlugin.attribute_names
将显示所有列,即使它们仅由子类型使用。

是的,当ActiveRecord连接到数据库后加载架构时,您可以实现所描述的内容

我已经在另一个stackoverflow问题上写过使用STI和Rails+ActiveRecord的“最佳实践”,这可能会有所帮助

对于您的用例,您需要确保插件不会与其列冲突,因此您可能需要为每个插件提供某种列命名方案/前缀


我不再在Rails中使用ActiveRecord,而是更喜欢功能更强大、性能更高的数据访问层。如果你没有被锁定在AccVIECORD中,你可能想考虑续集作为一种替代方案,因为它支持STI和CTI(),以及最新的PyGrice特性,比如JSONB,它可能更适合于你的用例,以防止插件与其他列冲突。或者只是简单地将插件相关数据存储在一个完全索引的JSON列中。

您有什么具体问题吗?@infused我更新了这个问题。