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