【问题标题】:have multiple users belong to one record in rails 5 app在rails 5应用程序中有多个用户属于一条记录
【发布时间】:2018-04-02 12:09:49
【问题描述】:

我正在构建一个 rails 5 ruby​​ 2.4.0 应用程序。

我有一个 Truck 模型和一个 User 模型。

我想参考卡车的几个用户.. 创建卡车的人、卡车的所有者和卡车的司机(如果与所有者不同的话)。我希望它只引用用户,因为我不想拥有可能类型的用户模型。

这在理论上可行吗?

我正在考虑这个:

卡车 has_many_users

用户 belongs_to 卡车(不确定如何操作?)

创建卡车时,它会记录当前用户 ID,然后用户可以为驾驶员关联和所有者关联选择系统用户...

请帮助我正在燃烧我的大脑试图映射出来..

【问题讨论】:

标签: ruby-on-rails activerecord


【解决方案1】:

因此,您正在寻找将TruckUser 关联多次,每个关联扮演不同的角色。

这绝对是可能的,也是建立关联的一种非常常见的方式。

但是,我肯定会设置它,以便 Truck 模型是子(“属于”)User 模型,原因有两个 -

  1. 卡车模型的知识应该是自包含的。它应该知道它的创建者、驱动程序和所有者是谁。因此,您希望将这些 id(外键引用)存储在 Truck 而不是 User 上。同样在您的情况下,每辆卡车可以有 1 个且只有 1 个创建者、司机或所有者。 (旁注:如果您确实有一个卡车可能有许多创建者、司机和所有者的情况,那么这将行不通,您必须依赖多对多关系,例如中间连接表。)

  2. 一个用户本质上可以与多辆卡车相关联。用户可以拥有 3 辆不同的卡车,或者他们可以拥有 1 辆卡车但驾驶另一辆卡车。 User 在此处具有 has_many 关系更有意义。

诀窍在于 ActiveRecord 让您可以随意命名关联。所以你可以试试-

class Truck < ApplicationRecord
  belongs_to :creator, class_name: "User", foreign_key: :creator_id
  belongs_to :owner, class_name: "User", foreign_key: :owner_id
  belongs_to :driver, class_name: "User", foreign_key: :driver_id
end

class User < ApplicationRecord
  has_many :created_trucks, class_name: "Truck", foreign_key: :creator_id
  has_many :owned_trucks, class_name: "Truck", foreign_key: :owner_id
  has_many :driven_trucks, class_name: "Truck", foreign_key: :driver_id
end

在我们覆盖的每一行中 -

  1. class_name,因为如果我们没有指定它,Rails 会使用关联的名称来猜测它。所以belongs_to :creator 会寻找Creator 模型,而不是User 模型

  2. foreign_key,因为如果我们没有指定它,Rails 会使用关联的名称来猜测它。所以belongs_to :creator 会在 this 模型上寻找creator_id(因为它属于另一个模型)。同样,如果我们有has_one :creator,它将在外部Creator 模型(或通过class_name 指定的任何内容)上查找creator_id

【讨论】:

  • 这里似乎缺少一些解释和部分过程。通常,当您指向外键时,它会查找您在通过class_name 链接到的表中指定的列,对吗?因此,如果 Truck 和 User 都指向 :creator_id 的外键,那么该列实际存在于哪个表中?两个都?两者都不?在一对相关表中究竟将如何使用这种场景?你能解释一下你还会做些什么来让它真正发挥作用吗?
  • belongs_tohas_many 的 Rails 文档提到“默认情况下,[外键] 被猜测为带有“_id”后缀的关联名称”。所以它使用关联名称 (:creator) 而不是类名称 User。对于belongs_to,Rails 在这张表(Truck)上查找名为:creator_id 的外键列。在has_many 的情况下,Rails 在 OTHER 表(也为 Truck)上查找名为 :creator_id 的外键列。它通过查看关联名称知道“其他”表的名称,或者您也可以明确指定它(class_name: "Truck").
  • 感谢您澄清每种情况下在何处寻找外键。那么按照这个逻辑,是不是没有必要将这些外键声明放在Truck 中? Rails 将通过添加_id? 自动根据关联名称正确地查找其中的每一个。它实际上只需要class_name: 'User' 将其引用到正确的表。
猜你喜欢
  • 2017-05-13
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多