activerecord关系,has_one vs现有表中的附加列

时间:2015-06-21 05:36:52

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

我有一个正常运行的客户模型。现在我有了新的要求。客户应该拥有一张驾驶执照。许可证的实施包括两件事 -

  1. 许可证应有两张图片(客户将上传)
  2. 许可证应具有状态(由管理员设置'已批准','待处理','已拒绝'等)
  3. 现在,我怀疑has_one关系与customers表中的其他列。有两种方法可以实现它

    1. 我创建了一个Licence模型,其中包含属性 - front_imageback_imagestatus,并在许可与客户之间建立has_one belongs_to关系
    2. 我创建了额外的列licence_statuslicence_front_imagelicence_back_imageCustomer模型本身。
    3. 哪种方法更好?

1 个答案:

答案 0 :(得分:1)

在我看来,一对一的关系相当容易理解,但很难看出何时使用它。

一个示例是一款可选择让用户连接其FacebookTwitter帐户的应用。

enter image description here

在这种情况下,对于特定用户,facebook_account_idtwitter_account_id可以是NULL,这意味着用户没有连接他们的Twitter和/或Facebook帐户。此外,facebook_accountstwitter_accounts表格根本不会引用users表格。

当然,您可以将facebook_accounts表中的所有字段直接移到user表中。 任何一对一的关系都是如此,这就是为什么很难看到何时使用它的原因。

我遵循的经验法则是:如果你有一个逻辑分组的字段,可以选择NULL, 将这些字段以一对一的关系分成单独的表格是一个好主意。

在您的情况下,看起来License模型确实是字段的逻辑分组,可以选择NULL。因此,请使用方法1。此外,正如评论中所提到的,如果将来您可能希望扩展License模型,那么使用1