如何定义两个has_many之间的关系:通过模型?

时间:2011-06-01 04:33:39

标签: ruby-on-rails

我有两个模型“用户”和“事件”,我使用has_many:through定义来定义用户和事件之间的多对多关系。每个用户可以属于0个或多个事件,每个事件可以有0个或多个与之关联的用户。

我知道当我有一个has_many和belongs_to关系时,我可以简单地执行user.events.create(arg),并且rails知道该事件与该给定用户相关联。但是,当它是多对多时,我该如何关联它们?我怎么说用户X现在属于事件A而用户Y属于事件A而用户X也属于事件B.那么,另外,如果我想要如何销毁这种关系?

由于事件和用户都不属于单个用户/事件......如何在创建用户实例和事件实例后定义关系?

所以......我猜我在问这是否有效:

@user = User.create(args)
@event = Event.create(args)
@user.events << @event

这会自动将用户与我刚刚添加到用户的事件相关联吗?它似乎有效,但是当我尝试这个时:

@user2 = User.create(args)
@user2.events << @event

这似乎并未将@ user2与该特定事件相关联,但它将该事件与@ user2相关联。我做了:

@event.users

并且只列出了@user ...而不是@ user2。

2 个答案:

答案 0 :(得分:0)

查看有关关联的rails指南。具体为4.3 has_many Association Reference

部分

看起来你正在寻找的方法是@ customer.orders&lt;&lt; @ order1。在您的情况下,使用@user和@event,您将要执行以下操作:

@user.events << @event

将创建正确的关联。

答案 1 :(得分:0)

我就是这样做的:

class User
  has_many :events, :through => :user_event_associations
  has_many :user_event_associations

class Event
  has_many :users, :through => :user_event_associations
  has_many :user_event_associations


class UserEventAssociation
  belongs_to :user
  belongs_to :event

如果你这样做,你可以做

some_user_object.events << some_event_object

然后如果你重新加载some_event_object,你也会看到那里的关系。请注意,user_event_associations是连接表,并且作为真实的表和模型存在,只有上面的那两行。我从来没有使用过那张桌子 - 这是支持多对多关联的一种不足之处。

至于破坏行为,您可以查看dependent => destroy