我有User
和Truck
s。我希望能够说出@truck.drivers << @users
和@user.truck = @truck
。
解决方案很简单,直到我希望将关系存储在连接表中。
# tables
:users
:id
:truck_drivers
:user_id
:truck_id
:truck
:id
我已经知道我可以说@truck.drivers << @user
和@user.trucks << @truck
,但我想限制用户一次占用一辆卡车,为了我的理智。
有可能吗?带有连接表的has_many / belongs_to?或者我应该尝试不同的方法?我没有在连接表中使用第三个模型。它只是一张桌子。这是我到目前为止所拥有的。
class User < ApplicationRecord
has_and_belongs_to_many :trucks,
join_table: :truck_drivers, # points to the table
class_name: :Truck # looks for the truck model in the table
end
class Truck < ApplicationRecord
belongs_to :company
has_and_belongs_to_many :drivers,
join_table: :truck_drivers,
class_name: :User
end
我首先需要一个联接表的原因是因为每个User
可以有很多Role
:管理员,经理,司机,客户服务等等。我认为它没有&#39;如果所有用户都不打算使用卡车,那么向所有用户添加truck_id
是有意义的。
答案 0 :(得分:1)
看起来你应该能够做类似的事情:
@user.trucks << @truck unless @user.trucks.any?
答案 1 :(得分:0)
是的,这是使用:through
关键字的rails的标准策略。
rails文档:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association
使用TruckUser
和truck_id
制作一个名为 user_id
的模型
然后编辑你的课程:
class User < ApplicationRecord
has_many :truck_users
has_many :trucks, through: :truck_users
end
class Truck < ApplicationRecord
belongs_to :company
has_many :truck_users
has_many :drivers, through: :truck_users
end
class TruckUser < ApplicationRecord
belongs_to :truck
belongs_to :user
end