Ruby on rails 三元关系中的自参考轨道

Ruby on rails 三元关系中的自参考轨道,ruby-on-rails,database,Ruby On Rails,Database,我正在建立一个社交网站,其中一个成员可以邀请另一个成员参加一个活动。这里是ERD的图片 如何在迁移和模型中建立关系?rails文档处理二进制关系。成员/邀请/事件关系通常如下所示: 型号 class Member < ActiveRecord::Base has_many :invites end class Event < ActiveRecord::Base has_many :members, :through :invites end class Invite &l

我正在建立一个社交网站,其中一个成员可以邀请另一个成员参加一个活动。这里是ERD的图片


如何在迁移和模型中建立关系?rails文档处理二进制关系。

成员/邀请/事件关系通常如下所示:

型号

class Member < ActiveRecord::Base
 has_many :invites
end

class Event < ActiveRecord::Base
 has_many :members, :through :invites
end

class Invite < ActiveRecord::Base
 belongs_to :member
end
类成员
此建模向我们显示,一个成员有许多邀请,其中每个邀请都属于特定事件。现在,您希望能够访问特定活动的所有成员(收到邀请的成员);这是通过使用多个
:通过
关联来实现的


希望这有助于提供类名,并且您的
的外键有很多关系,您可以根据需要命名您的关联。
邀请
模型将用作加入,将您的活动链接到相互邀请的成员

class Member < ActiveRecord::Base
   has_many :invites, class_name: "Invitation", foreign_key: "invited_member_id"
   has_many :invitees, class_name: "Invitation", foreign_key: "inviting_member_id"
end

class Invitation < ActiveRecord::Base
   belongs_to :event
   belongs_to :inviting_member, class_name: "Member"
   belongs_to :invited_member, class_name: "Member" 
end

class Event < ActiveRecord::Base
    has_many :invitations
    has_many :invited_members, through: :invitations
    has_many :inviting_members, through: :invitations
end
类成员
可以这样使用

?> m1 = Member.find 1
=> #<Member id: 1, username: "user1", created_at: "2015-07-07 04:01:41", updated_at: "2015-07-07 04:01:41">
>> m2 = Member.find 2
=> #<Member id: 2, username: "user2", created_at: "2015-07-07 04:01:43", updated_at: "2015-07-07 04:01:43">
>> e = Event.create name: "my cool event"
=> #<Event id: 2, name: "my cool event", created_at: "2015-07-07 04:11:49", updated_at: "2015-07-07 04:11:49">
>> Invitation.create event: e, inviting_member: m, invited_member: m2
=> #<Invitation id: 2, event_id: 2, inviting_member_id: 1, invited_member_id: 2, created_at: "2015-07-07 04:12:01", updated_at: "2015-07-07 04:12:01">
>> m1.reload
=> #<Member id: 1, username: "user1", created_at: "2015-07-07 04:01:41", updated_at: "2015-07-07 04:01:41">
>> m1.invites
=> #<ActiveRecord::Associations::CollectionProxy []>
>> m1.invitees
=> #<ActiveRecord::Associations::CollectionProxy [#<Invitation id: 1, event_id: 1, inviting_member_id: 1, invited_member_id: 2, created_at: "2015-07-07 04:03:58", updated_at: "2015-07-07 04:03:58">, #<Invitation id: 2, event_id: 2, inviting_member_id: 1, invited_member_id: 2, created_at: "2015-07-07 04:12:01", updated_at: "2015-07-07 04:12:01">]>

>> e = Event.first
=> #<Event id: 1, name: "Cool", created_at: "2015-07-07 04:01:54", updated_at: "2015-07-07 04:01:54">

>> e.inviting_members
 => #<ActiveRecord::Associations::CollectionProxy [#<Member id: 1, username: "user1", created_at: "2015-07-07 04:01:41", updated_at: "2015-07-07 04:01:41">]>
>> e.invited_members
=> #<ActiveRecord::Associations::CollectionProxy [#<Member id: 2, username: "user2", created_at: "2015-07-07 04:01:43", updated_at: "2015-07-07 04:01:43">]>
?>m1=Member.find 1
=> #
>>m2=成员。查找2
=> #
>>e=事件。创建名称:“我的酷事件”
=> #
>>邀请。创建活动:e,邀请成员:m,邀请成员:m2
=> #
>>m1.重新加载
=> #
>>m1.邀请
=> #
>>m1.被邀请者
=> #
>>e=事件优先
=> #
>>e.邀请联合国会员
=> #
>>e.受邀的欧洲联盟成员
=> #
邀请迁移:

class CreateInvitations < ActiveRecord::Migration
  def change
    create_table :invitations do |t|
      t.references :event, index: true, foreign_key: true
      t.integer :inviting_member_id
      t.integer :invited_member_id

      t.timestamps null: false
    end
  end
end
class CreateInvestments
只有收到邀请的成员才能正确参加活动?我不需要更改邀请表的主键吗?我不明白为什么。邀请基本上是单独的。我上面的代码只是简单地展示了如何创建关联。我假设会有其他字段,比如accepted\u on、defeed\u on等,然后可以为这些字段建立作用域/关联。邀请将有自己的主键,。并且只包含对其他表的引用(您应该根据需要创建索引和外键)