有多个用户属于rails 5 app中的一个记录

时间:2018-04-02 02:24:33

标签: ruby-on-rails activerecord

我正在构建一个rails 5 ruby​​ 2.4.0 app。

我有一个卡车型号和一个用户型号。

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

这在理论上是否可行?

我正在考虑这个问题:

卡车has_many_users

用户所属的卡车(不知道如何工作?)

创建卡车时,它会记录当前用户ID,然后用户可以选择系统用户作为驱动程序关联和所有者关联......

请帮助我焚烧我的大脑试图将其映射出来..

1 个答案:

答案 0 :(得分:1)

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

这绝对是可能的,也是建立社团的一种常见方式。

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

  1. 卡车车型的知识应该是自成一体的。它应该知道它的创建者,驱动者和所有者是谁。所以你希望那些id(外键引用)存储在Truck而不是User。同样在您的情况下,每辆卡车可以有1个且只有1个创建者,驱动者或所有者。 (附注:如果你确实有一个卡车可能拥有众多创造者,司机和所有者的案例,那么这将无法运作,你必须依赖像中介这样的多对多关系加入表。)

  2. 用户可以固有地与多辆卡车相关联。用户可以拥有3辆不同的卡车,或者他们可以拥有1辆卡车但是可以驾驶另User在这里建立has_many关系更有意义。

  3. 诀窍在于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会在模型上寻找creator_id(因为它属于其他模型)。同样,如果我们有has_one :creator,它会在外国creator_id模型上寻找Creator(或通过class_name指定的任何内容)。