2016-10-27 4 views
0

많은 초청자가 있지만 초청자가 하나있는 사용자 인스턴스가 있습니다. 해당 사용자 및 초대받은 사람과 관련된 초대 자 인스턴스에 액세스하려고합니다.하나가 있고 그 자체가 많습니다.

즉 :

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과 동일은 초대 인스턴스의 콜렉션을 리턴합니다.

어떻게 작동시키는 지 알고 계십니까?

+0

'inviter'및 'invitee'모델에 대한 코드를 제공 할 수 있습니까? – davidhu2000

+0

초청자 초대 대상자 모델이 없습니다. 'inviter'가 초청 모델 – rararake

답변

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 
+0

'has_one : invitation'을 통해 다른 'user'를 참조합니까? 그리고 왜 has_many에있는'inviter_id'에 외래 키가 있습니까? – rararake

+0

예! 내 잘못이야. 나는 그것을 편집 할 것이다. –

+0

'user.inviter'가 작동하고 그를 초대 한 사용자를 반환한다. 그러나'user.invitees'는''users '대신에'invitation' 인스턴스 콜렉션을 반환합니다 – rararake

0

user.invitees가 초대 기록의 수집을 줄 것이다. 쿼리를 사용자 모델로 쿼리를 사용하면 사용자 모델을 참조하는 모든 invitee_id를 사용하여 쿼리를 수집 할 수 있습니다.

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