为什么我不能在关系中添加对象?

时间:2013-03-21 07:04:17

标签: ruby-on-rails-3.2 has-and-belongs-to-many

刚学铁路......

我有以下型号:

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通过关系吗?

2 个答案:

答案 0 :(得分:2)

如果您希望将user_id和timeslot_id之外的任何信息作为关系发送的一部分,则联接模型是一种很好的模式。例如,如果您拥有groupsusers并且您拥有多对多关系,但有时用户是某个组的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