刚学铁路......
我有以下型号:
class TimeSlot < ActiveRecord::Base
has_and_belongs_to_many :users
end
class User < ActiveRecord::
has_and_belongs_to_many :time_slots
end
我也有一个模型加入这两个:
class TimeSlotsUsers < ActiveRecord::Base
attr_accessible :time_slot_id, :user_id
end
在控制台中,我创建了一个用户对象,我想将它与TimeSlot相关联。我有一个变量ts
是一个TimeSlot对象,u
是一个用户对象。两者都已存在于数据库中。当我ts.users << u
时,我收到一条错误消息“ActiveRecord :: StatementInvalid:SQLite3 :: ConstraintException:time_slots_users.created_at可能不是NULL:INSERT INTO”time_slots_users“(”time_slot_id“,”user_id“)VALUES(1 ,1)。
为什么created_at会为null?是否在创建TimeSlotsUsers中的记录时自动创建?我需要使用has-many通过关系吗?
答案 0 :(得分:2)
如果您希望将user_id和timeslot_id之外的任何信息作为关系发送的一部分,则联接模型是一种很好的模式。例如,如果您拥有groups
和users
并且您拥有多对多关系,但有时用户是某个组的admin
,则可以放置{{1连接模型上的属性。
为了保持你的连接模型,一个更好的Rails模式如下......
is_admin
我不同意其他一个主张在联接表上没有主键的答案
例如,当您想要使用REST API删除或编辑该关系时,拥有关系的唯一ID很重要。是否拥有class TimeSlot < ActiveRecord::Base
has_many :time_slot_users
has_many :users, through: :time_slot_users
end
class User < ActiveRecord::Base
has_many :time_slot_users
has_many :time_slots, through: :time_slot_users
end
class TimeSlotsUsers < ActiveRecord::Base
belongs_to :users
belongs_to :time_slots
end
或updated_at
取决于它们是否是您问题域中的有用数据。例如,知道用户何时被添加到组中(或者可能不是),这可能是有用的信息。
在(user_id,time_slot_id)上的连接表上具有唯一索引以确保数据完整性非常重要。 Rails模型可以在99.999%的实例中可靠地验证唯一性,但不是100%的时间。
答案 1 :(得分:1)
habtm关系should not have created_at
and updated_at
columns的联接表。您也不需要连接模型。
如果您想对加入表格执行某些操作和/或向其添加属性,则应更改为has_many :through
。