【问题标题】:Database Association, Can a class has_many and belong_to the same object?数据库关联,一个类可以has_many和belong_to同一个对象吗?
【发布时间】:2013-04-17 20:41:54
【问题描述】:

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

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

类用户 ???

类事件 ????

谢谢!

【问题讨论】:

  • 如果您了解foreign_keys,您就会明白为什么在这种情况下需要连接表。当您说用户属于一个事件时,您是说事件的 ID 在用户的 event_id 属性上,作为一个外键......这意味着用户一次只能属于一个事件,如果这是您的目的,那很好。 “干”并不意味着没有连接表......连接很有趣!

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


【解决方案1】:

您需要建立 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

【讨论】:

  • 有点像初学者的问题,但我必须在 db/migrate 文件中输入外键吗?
  • 这就是t.references 为您做的事情。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    请注意,如果一个事件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 仍将返回一个用户。

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        • 2015-03-07
        • 1970-01-01
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多