gpt4 book ai didi

ruby-on-rails - rails : Multiple "types" of one model through related models?

转载 作者:行者123 更新时间:2023-12-03 15:05:40 26 4
gpt4 key购买 nike

我的应用程序中有一个 User 模型,我想在其中存储基本的用户信息,例如电子邮件地址、名字和姓氏、电话号码等。

我的系统中还有许多不同类型的用户,包括销售代理、客户、访客等。

我希望能够使用相同的 User 模型作为所有其他模型的基础,这样我就不必在一个模型中包含所有相关角色的所有字段,并且可以根据需要委派(减少重复的数据库字段以及提供从一种类型的用户更改为另一种类型的用户的轻松移动性)。

所以,我想要的是:

User
-- first name
-- last name
-- email
--> is a "client", so
---- client field 1
---- client field 2
---- client field 3

User
-- first name
-- last name
-- email
--> is a "sales agent", so
---- sales agent field 1
---- sales agent field 2
---- sales agent field 3

and so on...

此外,当新用户注册时,我希望新用户自动被分配“客户”的角色(我在这里谈论的是数据库字段,而不是授权,尽管我希望最终将这个逻辑包含在我的用户授权也是如此)。我有一个多步骤注册向导,我正在尝试使用 wizardly 构建.第一步很简单,因为我只是调用基本 User 模型中包含的字段(例如 first_nameemail),但是第二步比较棘手,因为它应该调用关联模型中的字段(比如——根据我上面的示例——模型 client 带有字段 client_field_1 client_field_2,就像这些字段是 User 的一部分一样)。

这有意义吗?如果一点都不清楚,请告诉我,我会尝试以不同的方式进行解释。

谁能帮我解决这个问题?我该怎么做?

最佳答案

如果您使用的是 ActiveRecord(从 Rails 3 开始,很容易更改 ORM),STI 可能非常适合您的要求,正如 tadman 所建议的那样。基本信息可在 AR documentation page 上找到。 ,但这里有一些额外的信息 w.r.t.你的目标:

  • 为每个文件定义一个模型。否则会有一些初始化麻烦。假设 Client 在单个文件中全部从 User 继承,只要 User 构造函数未被调用一次,就无法创建 Client 对象。每个模型一个文件可以避免这个问题。
  • 层次结构中的所有属性都在顶级类中一次性定义。这是为了性能问题,但在博客文章中似乎让很多人感到不安。简而言之,Ruby 代码是面向对象的,并且对属性进行了适当的封装。数据库包含单个表中的所有内容,并带有额外的“类型”列以区分它们在层次结构中的位置。这只是在关系数据库中表示继承树的“技巧”。我们必须知道 ORM 映射并不简单。 image on this site from Martin Fowler可能有助于了解情况。

此外,您希望任何新用户成为客户端,其中客户端继承自用户。为此,您可以简单地将任何新用户实例化为客户端。在您用于创建用户的 Controller 中:

user = Client.new
# Do something to user
user.save
#=> <Client id: 1, name: "Michael Bolton", email: "mike@bolton.net", created_at: "2010-05-30 03:27:39", updated_at: "2010-05-30 03:27:39">

当使用 ActiveRecords 时,以上所有内容对于 Rails 3 仍然有效。

关于ruby-on-rails - rails : Multiple "types" of one model through related models?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2916027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com