2015-10-29 45 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

相关问题