Ruby on rails 如何在Rails中表示非用户的人

Ruby on rails 如何在Rails中表示非用户的人,ruby-on-rails,design-patterns,Ruby On Rails,Design Patterns,我正在尝试构建一个类似于CRM的rails应用程序,在这里我有用户,每次使用都有许多“客户机” 最初,我为一个用户和一个客户端创建了一个模型,但在编写单元测试时,我意识到这两个模型非常相似 所以我的问题是:我最初对它们分别建模的设计决定正确吗?还是有更好的重用代码的方法,即使我不认为客户端能够真正登录到系统中 我看过类似的问题,但它们都适用于不同的用户类型和角色。在这种情况下,客户机只作为一个模型存在,永远不会真正成为用户。也许你应该给用户一个类型(例如通过创建一个类型模型并将has\u man

我正在尝试构建一个类似于CRM的rails应用程序,在这里我有用户,每次使用都有许多“客户机”

最初,我为一个用户和一个客户端创建了一个模型,但在编写单元测试时,我意识到这两个模型非常相似

所以我的问题是:我最初对它们分别建模的设计决定正确吗?还是有更好的重用代码的方法,即使我不认为客户端能够真正登录到系统中


我看过类似的问题,但它们都适用于不同的用户类型和角色。在这种情况下,客户机只作为一个模型存在,永远不会真正成为用户。

也许你应该给用户一个类型(例如通过创建一个类型模型并将has\u many/belish\u与ActiveRecord关联起来):这样一个用户就可以是客户机或任何你想要的东西


然后,您可以使用(非常棒的gem)管理用户权限,具体取决于它们的类型。

在任何CRM应用程序中,用户和客户端之间都有相似之处和不同之处。让我们讲一些细节

相似之处

  • 用户和客户都共享各种属性,尤其是与个人信息(姓名、联系信息等)相关的属性
  • 两者(大部分)都代表一个且仅代表一个与系统有关系的人。一个明显的例外是系统用户
差异

  • 用户访问系统。这意味着安全需求,如身份验证、标识和授权,这反过来意味着一些验证(密码、证书等)
  • 在CRM中,客户通常具有各种关系,例如与客户、公司、团队、客户经理和其他人的关系,而用户没有。尽管这不是由模型处理的,但是您可以选择对某些字段执行一些模型级验证

因此,在两种不同的模型中分离用户和客户机、将它们组合起来或从父类中进行子类化的选择取决于您的实际需要。在定义
is\u system\u User
属性时,有些系统(例如,如果我没记错的话)以相同的方式对待客户机和用户。就我个人而言,出于上述差异和安全原因,我会选择将它们分开。如果您不确定自己的需要,那么将它们分开比较安全(虽然不太干燥)。

设置一个名为
is_client
的列怎么样?需要查看用户和客户端的属性,通常可以登录的用户具有密码等属性,最后一次登录等。如果客户不是实际用户,那么将他们保留在单独的模型中是有意义的。我不是一个粉丝,但这可能是STI发挥作用的情况?@tihom:我同意。我想我是太干了。一个很好的选择是studying OpenERP(一个开源的可扩展业务平台)以及它如何处理用户和客户,也许这会给你一些洞察力。有一些代码在拥有两个类时被复制,但这可能是有道理的,因为正如您所说,它们之间的差异远大于相似之处。我认为在这种情况下,试图保持超级干性是过分的。你可以通过从一个保持共性的父类继承子类来保持干性。当您的具体需求仍然不清楚时,您可能会暂时选择牺牲它。这是敏捷开发规程中的常见实践