我正在构建一个rails 5 ruby 2.4.0 app。
我有一个卡车型号和一个用户型号。
我想将几个用户引用到卡车上......创建卡车的人,卡车的所有者和卡车的司机(如果与车主的卡车不同)。我希望它仅引用用户,因为我不想拥有可能类型的用户模型。
这在理论上是否可行?
我正在考虑这个问题:卡车has_many_users
用户所属的卡车(不知道如何工作?)
创建卡车时,它会记录当前用户ID,然后用户可以选择系统用户作为驱动程序关联和所有者关联......
请帮助我焚烧我的大脑试图将其映射出来..
答案 0 :(得分:1)
因此,您正在寻找的是多次将Truck
与User
相关联,每个协会扮演不同的角色。
这绝对是可能的,也是建立社团的一种常见方式。
但是,我肯定会设置它,以便Truck
模型是User
模型的孩子("属于"),原因有两个 -
卡车车型的知识应该是自成一体的。它应该知道它的创建者,驱动者和所有者是谁。所以你希望那些id(外键引用)存储在Truck
而不是User
。同样在您的情况下,每辆卡车可以有1个且只有1个创建者,驱动者或所有者。 (附注:如果你确实有一个卡车可能拥有众多创造者,司机和所有者的案例,那么这将无法运作,你必须依赖像中介这样的多对多关系加入表。)
用户可以固有地与多辆卡车相关联。用户可以拥有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
在每一行中我们覆盖 -
class_name
,因为如果我们没有指定它,Rails会使用相关的名称来猜测它。因此,belongs_to :creator
会寻找Creator
模型,而不是User
模型
foreign_key
,因为如果我们没有指定它,Rails会使用相关的名称来猜测它。因此,belongs_to :creator
会在此模型上寻找creator_id
(因为它属于其他模型)。同样,如果我们有has_one :creator
,它会在外国creator_id
模型上寻找Creator
(或通过class_name
指定的任何内容)。