【问题标题】:Rails: How to store extra attributes using single table inheritance?Rails:如何使用单表继承存储额外的属性?
【发布时间】:2014-12-17 11:13:04
【问题描述】:

我正在使用 Ruby on Rails、Rails 4 构建一个应用程序。

假设我有一张表Users,我想指定两种类型的用户User_1User_2

User_1 将使用父表 Users 中的所有列,但 User_2 将使用 User 表中的所有列,例如 User_1,但需要两个额外的列来保存详细信息。问题是这些额外的细节存储在哪里以及如何存储?

这些列是否添加到父表Users?还是ModelController 中编码的额外属性?我正在寻找存储两个整数数据,他们将在他们的个人资料中输入。

感谢您的观看! :)

【问题讨论】:

  • 我通常只在模型具有相同属性但需要不同行为的情况下使用 STI。如果您发现所需的各种属性之间存在区别,最好选择两个表和模型。
  • 如果唯一的区别在于 User_2 有额外的属性,那么只需将其保留在一个模型中即可。仅当两种类型的用户具有相同名称但行为不同的方法时,使用 STI 分离模型才有意义。
  • 我相信 Roob 在这种情况下是正确的。除了附加属性之外,这两个用户在应用程序上的行为和功能会略有不同。非常感谢你们的意见。
  • 我希望“单表”可以作为一种赠品,用于查找或放置属性的位置):) :)

标签: mysql ruby-on-rails ruby database activerecord


【解决方案1】:

单表继承基本上意味着User 的所有子类都共享一个数据库表,在您的情况下为users。由于您需要将数据存储在数据库中,因此您需要在 users 表中添加额外的列。

你可以找到more information on STI in the Rails documentation

【讨论】:

  • 太棒了!只是为了检查一下,我猜将这个属性/列下的所有User_1 值保持为空是有意义的吗?感谢五位数! :)
  • 是的,您需要确保列可以为 null(或一些合理的默认值),以防止在保存 User_1 的实例时出现数据库错误。
  • 如果属性和功能至少有一些重叠,STI 最有意义。如果它们完全不相交,我会考虑其他选择:分离模型、混合共享行为和使用多态链接。
【解决方案2】:

额外的属性都存储在父表User中。在 STI 场景背后,您的数据库中只有一个表,其属性 type 告诉 rails 应该使用哪个模型。如果您希望继承模型具有某些列,则必须在您的父模型中设置它,即。在您的数据库中。

额外的属性存储在数据库中,您的模型是帮助您访问它的方式。

【讨论】:

  • 所以要定义Users之间的差异,我还必须在User表中存储一个StringType
  • 是的,您的基表users 将需要一个名为type 的字符串类型的列,该列将包含继承模型的名称(在您的示例中为User_1User_2)来检索它们。看看@fivedigit 提到的文档。
【解决方案3】:

它接缝你需要提到的Single Table Inheritance。 但在您继续之前,我真的建议您检查有关它们的更多信息。查看blog post 以获得更多理论解释以及如何以及何时使用它。

如需更完整的示例,请查看this example

如果您仍然有 railscast 的专业帐户,请there's one about

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多