Ruby on rails rails STI:子类的特定属性

Ruby on rails rails STI:子类的特定属性,ruby-on-rails,rails-activerecord,rails-migrations,Ruby On Rails,Rails Activerecord,Rails Migrations,我正在开始构建我的第一个rails应用程序,我已经有了带有STI的用户模型(管理员、员工、公众和代表都继承自用户模型)。 但现在我想为代表性的子类添加特定的列(address、state、phone),但我不能直接为子类模型应用迁移 第一个解决方案是将这些列添加到用户模型中,但我不知道如何将access限制为仅代表性的子类 第二种解决方案是创建一个单独的联系人表,然后使用多态关联(我想与其他模型关联)并添加属性 我的问题是,对于这种情况,什么是最好的解决方案?如果有更好的解决方案呢 谢谢希望

我正在开始构建我的第一个rails应用程序,我已经有了带有STI的用户模型(管理员、员工、公众和代表都继承自用户模型)。 但现在我想为代表性的子类添加特定的列(address、state、phone),但我不能直接为子类模型应用迁移

  • 第一个解决方案是将这些列添加到用户模型中,但我不知道如何将access限制为仅代表性的子类
  • 第二种解决方案是创建一个单独的联系人表,然后使用多态关联(我想与其他模型关联)并添加属性
  • 我的问题是,对于这种情况,什么是最好的解决方案?如果有更好的解决方案呢
谢谢

希望你一切顺利

我认为第二个选择比第一个好

原因: 1) 若所有字段都是可选的,那个么它将创建具有空值的记录,但在第二种情况下,若所有字段都是可选的,那个么将不会创建记录,并没有必要为此创建任何条目

2) 将来需要将此字段添加或使用到其他模型中,这样您就可以轻松地使用多态关联了。

希望您做得好

我认为第二个选择比第一个好

原因: 1) 若所有字段都是可选的,那个么它将创建具有空值的记录,但在第二种情况下,若所有字段都是可选的,那个么将不会创建记录,并没有必要为此创建任何条目


2) 将来需要将此字段添加或使用到其他模型中,然后您可以轻松地使用多态关联。

在这种情况下,听起来您滥用了STI的概念。一般的规则是,对于不同的子模型和不同的行为,您可能有不同的关联,但您总是拥有所有子模型使用的所有表列

为什么要使用STI的整个想法是,所有模型都包含相同的数据结构,但可能有不同的行为。在您的情况下,我建议使用关联(正如您自己所建议的),然后在子模型中添加
has_one/has_many
,这将限制继承链中的关联范围

在不修补ApplicationRecord的情况下,无法将列仅限于某些子模型。但在任何情况下,即使您成功地制作了一个补丁来引入这种行为,您的数据库表仍将拥有所有表的所有列,因此由于列为半空、大小增加和性能降低,导致数据库表变大


我希望这能回答你的问题。

在这种情况下,听起来你滥用了性传播感染的概念。一般的规则是,对于不同的子模型和不同的行为,您可能有不同的关联,但您总是拥有所有子模型使用的所有表列

为什么要使用STI的整个想法是,所有模型都包含相同的数据结构,但可能有不同的行为。在您的情况下,我建议使用关联(正如您自己所建议的),然后在子模型中添加
has_one/has_many
,这将限制继承链中的关联范围

在不修补ApplicationRecord的情况下,无法将列仅限于某些子模型。但在任何情况下,即使您成功地制作了一个补丁来引入这种行为,您的数据库表仍将拥有所有表的所有列,因此由于列为半空、大小增加和性能降低,导致数据库表变大


我希望这能回答您的问题。

谢谢,我会使用多态关联选项,但我会等一等,以防有人有其他新选项建议谢谢,我将使用多态关联选项,但我会等待一段时间,以防有人有另一个新选项提示我只是参考了这个继承定义,也许rails与PostgreSql有不同的继承定义,那么CTI呢?但据我所知,您谈论的是STI的Rails实现,对吗?你给出的例子是不同的概念。是的,我确实问过STI,但在问题的最后,我还问是否有更好的解决方案,我刚刚开始理解STI和CTI之间的区别,我只是提到了继承的定义,也许rails对继承的定义与PostgreSql不同,那么CTI呢?但据我所知,您谈论的是STI的Rails实现,对吗?你给出的例子是不同的概念。是的,我确实问了STI,但在问题的最后,我还问了是否有更好的解决方案,我刚刚开始理解STI和CTI之间的区别。