Ruby on rails 3.2 为什么可以';我不能向关系中添加对象吗?

Ruby on rails 3.2 为什么可以';我不能向关系中添加对象吗?,ruby-on-rails-3.2,has-and-belongs-to-many,Ruby On Rails 3.2,Has And Belongs To Many,只是学习rails 我有以下型号: class TimeSlot < ActiveRecord::Base has_and_belongs_to_many :users end class User < ActiveRecord:: has_and_belongs_to_many :time_slots end class时隙

只是学习rails

我有以下型号:

class TimeSlot < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class User < ActiveRecord::
   has_and_belongs_to_many :time_slots
end
class时隙
我还有一个模型可以连接这两个:

class TimeSlotsUsers < ActiveRecord::Base
  attr_accessible :time_slot_id, :user_id
end
class TimeSlotsUsers

在控制台中,我创建了一个用户对象,并希望将其与时间段相关联。我有一个变量
ts
,它是一个时隙对象,而
u
是一个用户对象。数据库中已存在这两个选项。当我对habtm关系执行
ts.users操作时。您也不需要join模型


如果您想对join选项卡执行某些操作和/或向其添加属性,您应该更改为
has\u many:through

如果您想将用户id和时隙id以外的任何信息作为关系的一部分,那么join模型是一个很好的模式。例如,如果您有
用户
,并且您有多对多关系,但有时用户是组的
管理员
,则可以将
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
class时隙
我不同意另一个主张在联接表上没有主键的答案。
例如,当您想使用RESTAPI删除或编辑关系时,拥有关系的唯一id非常重要。是否在
处更新或在处创建
取决于它们是否是问题域中的有用数据。例如,了解用户何时添加到组(也可能不添加)可能是有用的信息


在连接表上有一个唯一的索引(user\u id,time\u slot\u id)以确保数据完整性非常重要。Rails模型可以在99.999%的实例中可靠地验证唯一性,但不是100%的情况下。

当使用
has\u和\u-belish\u-many
时,Rails不会设置
updated\u和
created\u-at
列。唯一的方法就是破解Rails或者向数据库中添加触发器。您可以删除它们,或者至少不需要它们。无法确定一个
是否有多个:这里需要的是通过
,但是从连接模型来看,
时间段\u用户
实际上只是一个连接表,没有任何额外的属性。在这种情况下,一个简单的
就足够了,我的答案解决了这个问题。我同意你的其他评论。啊!我没有意识到在
上更新的和在
上创建的
没有设置。这是有道理的。就设计而言,现在这个表是一个简单的连接表。你说我不需要连接模型是什么意思?连接表不是必需的吗?@Jeffreygunther:表是必需的,但不是模型。明白了。表必须存在于数据库中,但不需要定义Ruby/Rails对象。@JeffreyGuenther:没错。只需删除app/models/time\u slots\u users.rb
并删除这两个时间戳列,就可以了。