2013-03-21 122 views
1

刚学轨...为什么我无法将对象添加到关系中?

我有以下型号:

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在TimeSlotsUsers记录被创建时为空?是不是被自动创建的吗?我需要通过关系使用具有一对多的呢?

回答

2

如果您想将user_id和timeslot_id以外的任何信息作为关系链的一部分,则联接模型是一种很好的模式。例如,如果您有groupsusers,并且您拥有多对多关系,但有时用户是组的admin,则可以将is_admin属性放在连接模型上。

为了使您的加盟模式,更好的Rails的图案是如下...

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 

我与主张联结表中没有主键其他答案的一个不同意。
例如,要使用REST API删除或编辑该关系时,拥有唯一的关系标识非常重要。是否有updated_atcreated_at取决于它们是否是问题域中的有用数据。例如,可能有用的信息是知道用户何时被添加到组中(或者它可能不是)。

为确保数据完整性,在(user_id,time_slot_id)上的连接表上有一个唯一索引是非常重要的。 Rails模型可以在99.999%的实例中可靠地验证唯一性,但不是100%的时间。

+1

当使用'has_and_belongs_to_many'时,'updated_at'和'created_at'列不会被Rails设置。获得这种工作的唯一方法是通过黑客入侵Rails或向数据库添加触发器。你可能会删除它们,或者至少不要求它们。无法真正确定是否需要'has_many:through',但从连接模型看来,time_slots_users'实际上只是一个连接表,没有任何额外的属性。在这种情况下,一个简单的'has_and_belongs_to_many'就足够了,我的答案解决了这个问题。我同意你的其他意见。 – Mischa 2013-03-21 13:34:45

+0

啊!我没有意识到'updated_at'和'created_at'没有设置。这就说得通了。就设计而言,现在该表是一个简单的连接表。 – 2013-03-21 15:41:28

1

了的habtm关系should not have created_at and updated_at columns连接表。你也不需要加入模型

如果你想对连接tabel和/或添加属性做些什么,你应该改变为has_many :through

+0

当你说我不需要连接模型时,你是什么意思?连接表不是必需的吗? – 2013-03-21 15:42:11

+0

@JeffreyGuenther:表是必要的,但不是模型。 – Mischa 2013-03-21 15:43:01

+0

明白了。表必须存在于数据库中,但不需要定义Ruby/Rails对象。 – 2013-03-21 15:44:04

相关问题