0

所以我正在尝试创建一个简单的事件 Web 应用程序,其中类用户既可以创建类事件并参与它们。在用户类创建一个类事件的情况下,我希望该事件属于用户。但是,如果同一用户注册参加另一个活动,我希望该用户属于该活动,并且该活动属于拥有多个用户。我不知道这实际上是如何写在模型中的。

在一种情况下,用户类是属于该事件的参与者,而在另一种情况下,他们是主持人,而事件属于他们。如果我没有的话,我不想保持这种干燥并且不创建单独的用户类别(在这种情况下是主机和参与者)。一个简单的联合表似乎并不能解释这种条件关联。对最好的方法有什么建议吗?

类用户???

班级活动???

谢谢!

4

4 回答 4

2

您需要建立 2 个关联 - 一个链接到创建的事件,一个链接到订阅的事件:

create_table :event_subscriptions do |t|
  t.references :subscribed_user
  t.references :subscribed_event
end

create_table :events do |t|
  t.references :user
  # other fields
end

class User < ActiveRecord::Base
  has_many :events               # created Events
  has_many :event_subscriptions, :foreign_key => :subscribed_user_id
  has_many :subscribed_events, :through => :event_subscriptions  # subscribed Events
end

class EventSubscription < ActiveRecord::Base
  belongs_to :subscribed_user, :class_name => 'User'
  belongs_to :subscribed_event, :class_name => 'Event'
end

class Event < ActiveRecord::Base
  belongs_to :user               # the creating User
  has_many :event_subscriptions, :foreign_key => :subscribed_event_id
  has_many :subscribed_users, :through => :event_subscriptions   # subscribed Users
end
于 2013-04-17T21:16:24.457 回答
1

请注意,如果是事件,has_many :users则用户表必须有一event_id列,并且用户一次只能属于一个事件。我怀疑你想要用户和事件之间的多对多关系。如果是这种情况,您将使用此处has_and_belongs_to_many :users记录的关联

也就是说,是的,你可以在同一个类上有多个关系。

class Event < ActiveRecord::Base
  has_many :users
  belongs_to :host, :class_name => 'User'
end

events 表会有一个 column host_id,但 event.host 仍然会返回一个 User。

于 2013-04-17T21:11:32.543 回答
1

我建议您使用has_and_belongs_to_many关联(此处的文档)。根据您要完成的工作,我认为无法避免使用联合表。当然,这不应该让你气馁!

string我将向用户表(即主机或参与者)添加一个类型的“角色”列并使用has_and_belongs_to_many关联。请注意,您将需要创建一个users_events包含:user_id:event_id列的联合表。

然后,您可以拥有一个角色为“主持人”的用户,创建一个事件并邀请其他角色为“参与者”的用户。

当然,这只是我的建议。有几种方法可以解决这个问题。

于 2013-04-17T20:59:42.877 回答
0

我会在用户和事件之间使用 has_many 和 belongs_to 来处理这个问题。用户 has_many Events 和 Event belongs_to User。

剩下的就是你的逻辑了。您希望您的 has_many 关系成为您的活动所有者还是您的参与者。我假设 has_many 与事件所有者有关。

从那里在您的事件表中创建一个名为参与者的列。然后,在 Event 或 User 模型中,您可以创建一个 before_save 方法来插入参与者的 user_id。

然后,您可以在任一模型中创建一个范围,以返回事件所有参与者的列表。

于 2013-04-17T21:04:11.127 回答