我正在开始构建我的第一个rails应用程序,我已经有了STI的用户模型(管理员、员工、公共和代表都继承自用户模型)。但现在我想为代表性的子类添加特定的列(地址、状态、电话),但我不能直接为子类模型应用迁移。
- 第一个解决方案是在用户模型中添加这些列,但我不知道如何将acess限制为仅表示子类
- 第二个解决方案是创建一个单独的联系人表,然后使用多态关联(我想与其他模型关联)并添加属性
- 我的问题是,这个案子的最佳解决方案是什么?如果有更好的解决方案
感谢
希望你做得好
我认为第二种选择比第一种更好。
原因:1) 如果所有字段都是可选的,则它将创建具有null值的记录,但在第二种情况下,如果所有字段是可选的则不会创建记录,因此不需要任何条目。
2) 将来需要将这个文件添加或使用到其他模型中,然后您可以通过多态关联轻松完成。
在这种情况下,听起来你在滥用STI的概念。一般规则是,对于不同的子模型和不同的行为,您可能有不同的关联,但您总是拥有所有子模型使用的所有表列。
为什么你想使用STI的整个想法是,所有模型都包含相同的数据结构,但可能有不同的行为。在您的情况下,我建议使用关联(正如您自己建议的那样),然后在子模型中添加has_one/has_many
,这将限制继承链中的关联范围。
在不修补ApplicationRecord的情况下,不可能将列仅限于某些子模型。但在任何情况下,即使您设法制作了一个补丁来引入这种行为,您的数据库表仍将拥有所有表的所有列,从而由于半空列、大小增加和性能降低而导致数据库表变大。
我希望这能回答你的问题。