rails STI:子类的特定属性

时间:2017-02-14 11:08:28

标签: ruby-on-rails rails-activerecord rails-migrations

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

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

由于

2 个答案:

答案 0 :(得分:3)

希望你做得好

我认为第二种选择比第一种更好。

原因: 1)如果这个所有字段都是可选的,那么它将创建具有空值的记录,但在第二种情况下,如果所有字段都是可选的,则不会创建记录,不需要任何条目。

2)将来有需要在其他模型中添加或使用此文件,然后您可以通过多态关联轻松完成。

答案 1 :(得分:2)

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

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

如果不修补ApplicationRecord,则无法将列限制为仅某些子模型。但无论如何,即使你设法做一个补丁来引入这种行为,你的数据库表仍然会包含所有表的所有列,因此由于半空列,增加的大小和减少而导致更大的数据库表性能

我希望能回答你的问题。