数据库关联,一个类has_many和属于同一个对象吗?

时间:2013-04-17 20:41:54

标签: ruby-on-rails activerecord associations has-many belongs-to

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

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

类用户 ???

课程活动 ????

谢谢!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我建议您使用has_and_belongs_to_many关联(文档here)。 根据你想要完成的事情,我不认为联合表是可以避免的。当然,这不应该让你气馁!

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

然后,你可以让一个具有角色的用户,比如说“主持人”,创建一个事件并邀请角色“参与者”的其他用户。

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

答案 2 :(得分:1)

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

那就是说,是的,你可以在同一个班级上有多个关系。

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

事件表将有一列host_id,但event.host仍会返回一个用户。

答案 3 :(得分:0)

我会在用户和事件之间使用has_many和belongs_to来处理它。用户has_many事件和事件belongs_to用户。

其余的将是你的逻辑。您是否希望has_many关系成为您的活动所有者或您的参与者。我假设has_many与事件所有者有关。

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

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