有一个,有很多自己

时间:2016-10-27 01:13:06

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个用户实例,它有很多被邀请者但只有一个邀请者。 我正在尝试访问与该用户及其被邀请者相关联的邀请者实例。

即:

user.inviter #=> return another user instance.
user.invitees #=> return a collection on user instances

User.rb

class User  < ActiveRecord::Base
  has_one :inviter, class_name: Invitation, foreign_key: :invitee_id
  has_many :invitees, class_name: Invitation, foreign_key: :inviter_id
end

Invitation.rb

class Invitation < ActiveRecord::Base
  belongs_to :inviter, class_name: User, foreign_key: :inviter_id
  belongs_to :invitee, class_name: User, foreign_key: :invitee_id
end

迁移

class CreateInvitations < ActiveRecord::Migration
  def change
    create_table :invitations do |t|
      t.references :inviter, references: :user, index: true
      t.references :invitee, references: :user, index: true
      t.foreign_key :users, column: :inviter_id
      t.foreign_key :users, column: :invitee_id
      t.timestamps
    end
  end
end

这样做的一半是因为如果我在有邀请者的用户上调用user.inviter,它将返回邀请实例,但不会像我想的那样返回用户。 user.invitees的相同内容会在邀请实例上返回一个集合。

你们都知道如何让它发挥作用吗?

2 个答案:

答案 0 :(得分:0)

您应该使用through这样的选项:

class User  < ActiveRecord::Base
  has_one :invitation, inverse_of: :inviter
  has_one :inviter, through: :invitation
  has_many :invitations, inverse_of: :invitee
  has_many :invitees, through: :invitations
end

class Invitation < ActiveRecord::Base
  belongs_to :inviter, class_name: User, inverse_of: :invitation
  belongs_to :invitee, class_name: User, inverse_of: :invitations
end

答案 1 :(得分:0)

user.invitees 会提供邀请记录的集合。 使用 IN 查询用户模型,其中所有invitee_id引用用户模型将为您提供用户集合。

user_ids = user.invitees.map(&:invitee_id)
User.where(id: user_ids)