2015-10-29 46 views
0

我有一個具有以下關聯一個membership型號:如何獲得這個foreign_key關聯關聯的另一面?

class Membership < ActiveRecord::Base 
    belongs_to :family_tree 
    belongs_to :member 
    belongs_to :inviter, class_name: "User", foreign_key: "user_id" 
    belongs_to :invited, class_name: "User", foreign_key: "invited_id"  
end 

這是架構:

# == Schema Information 
# 
# Table name: memberships 
# 
# id      :integer   not null, primary key 
# family_tree_id   :integer 
# user_id     :integer 
# relation    :string(255) 
# member_id    :integer 
# invited_id    :integer 
# 

而且我User模式,我有以下幾點:

class User < ActiveRecord::Base 
has_many :memberships 
end 

所以我可以成功地爲2個不同的用戶分配1條記錄,例如:

[7] pry(#<RSpec::ExampleGroups::User>)> membership 
=> #<Membership id: 90, family_tree_id: 1049, user_id: 779, created_at: "2015-10-29 15:24:02", updated_at: "2015-10-29 15:24:02", relation: "sister", member_id: 108, connection_sent_at: nil, connection_responded_at: nil, connect_send_limit: nil, connect_times_sent: nil, connected: nil, connect_type: nil, request_status: nil, connection_removed_at: nil, invited_id: 777> 
[8] pry(#<RSpec::ExampleGroups::User>)> membership.family_tree 
=> #<FamilyTree id: nil, name: "Enrico McGlynn", user_id: 777, created_at: "2015-10-29 15:24:02", updated_at: "2015-10-29 15:24:02"> 
[11] pry(#<RSpec::ExampleGroups::User>)> membership.inviter 
=> #<User id: nil, email: "[email protected]", encrypted_password: "$2a$04$Ke.1sQ9mZ2ZP0Hxamg6NS.6zUoEHyolPbKJ1UfAlils...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2015-10-29 15:24:02", updated_at: "2015-10-29 15:24:02", first_name: "Audie", confirmation_token: nil, confirmed_at: "2015-10-29 15:23:57", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "quibusdam", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Quibusdam est laborum cupiditate modi et est. Nece...", last_name: "Feil", gender: 1> 
[12] pry(#<RSpec::ExampleGroups::User>)> membership.invited 
=> #<User id: nil, email: "[email protected]", encrypted_password: "$2a$04$jlFrLS6UlcchaJlsOAv4ne/5nYSxH.7Zdsvk5WZMd1w...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2015-10-29 15:24:02", updated_at: "2015-10-29 15:24:02", first_name: "Annamae", confirmation_token: nil, confirmed_at: "2015-10-29 15:23:57", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "eveniet", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Ut explicabo omnis facilis et. Dolor sunt enim et....", last_name: "Kshlerin", gender: 1> 

我遇到的問題是當我嘗試去其他方式時,即從該用戶記錄中查找與其關聯的所有memberships。它返回一個空數組。

[1] pry(#<RSpec::ExampleGroups::User>)> u1 
=> #<User id: nil, email: "[email protected]", encrypted_password: "$2a$04$jlFrLS6UlcchaJlsOAv4ne/5nYSxH.7Zdsvk5WZMd1w...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2015-10-29 15:24:02", updated_at: "2015-10-29 15:24:02", first_name: "Annamae", confirmation_token: nil, confirmed_at: "2015-10-29 15:23:57", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "eveniet", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Ut explicabo omnis facilis et. Dolor sunt enim et....", last_name: "Kshlerin", gender: 1> 
[9] pry(#<RSpec::ExampleGroups::User>)> u1.memberships 
=> [] 

如何獲得user.memberships返回與user_id and invited_idmemberships模型相關的成員?

回答

0

user.memberships相當於Membership.where(user_id: user.id)。您應該注意,與User型號關聯的memberships中的foreign_key默認爲user_id。要解決您的問題:

class User < ActiveRecord::Base 
#user.memberships will be equivalent to Membership.where(user_id: user.id) 
has_many :memberships 

#user.invited_memberships will be equivalent to Membership.where(inviter_id: user.id) 
has_many :invited_memberships, class_name: Membership, foreign_key: :inviter_id 

    def all_memberships 
    #this will return the memberships associated with the user_id and the inviter_id 
    #you may want to move this to the Membership model 
    Membership.where('user_id = ? OR inviter_id = ?', self.id, self.id) 
    end  
end 
+0

這是有道理的。我猜的一個問題是,在我接觸到其他人之前...... y確實'has_many:memberships'不會返回任何記錄,儘管有'user_id'記錄。 – marcamillion

+1

我注意到的一件事是返回的每個用戶記錄的'user.id'都是'nil'。這可能會導致這個問題?如果是這樣,我該如何解決它? – marcamillion

+0

呀'pry'表明'u1.id'是'nil' – AbM

相關問題