2012-11-13 1 views
2

를 통해 has_many 정의 한 후 : 관계를 통해를 has_many에서 수집 << 객체 기능을 사용할 때 나는 중간 객체를 얻는 방법 : 관계

@user = User.New(:name=>"Bob") 
@project = Project.New(:name=>"Market Survey") 
@user.projects << @project 

새로운 중간 오브젝트를 가져올 수있는 쉬운 방법이있다, 그것은 만들어? 중간 테이블 인 경우 등 위의 예에서와 같이, '회원'은 내가 사용할 수 있습니다

@membership = @user.projects << @project 

을 나는이 느낌이 우리가 모든 시간을 무엇보다이 일을 더 나은 방법, 즉이 있어야한다는

@membership = Membership.where(:user_id=>x , :project_id=>y).first 

답변

3

내가 알고있는이 작업을 수행하는 방법은 없습니다. 당신은 당신이 지금까지 한 일보다 더 읽고 뭔가를 찾고 있다면, 최고의 나는 이런 식으로 뭔가하는 것입니다 가지고 올 수 :

class User < ActiveRecord::Base 
    # ... other active record stuff here. 

    def membership_for(project) 
    memberships.where(:project_id => project.id).first 
    end 
end 

# Somewhere else... 
@user = User.new(:name=>"Bob") 
@project = Project.new(:name=>"Market Survey") 
@user.projects << @project 
@user.save! 

membership = @user.membership_for(@project) 

완벽하지를 추가 코드가 필요하지만, 현재 코드보다 더 잘 읽으며, Ruby에서 많은 도움이됩니다.

+0

아아! 모든 것이 불가사의 한 선상에서, 내가 흔히하고 간단한 일을하기 위해 여분의 명령 (여분의 쿼리도 의미한다)을해야만한다고 믿는 것이 어려웠다. –

0

당신은 같은 것을 할 수있는 :

@membership = @user.members.find_by_project_id(@project.id) 

확실하지를 경우 그것은 당신이 생각하고있는 것보다 더 나은/쉽게합니다. 내가 다른 방법이 있다고 생각, 당신이 회원을 찾으려면

@user = User.create(:name=>"Bob") 

# Create project and membership with user_id of @user same time, return project. 
@project = @user.projects.create(:name=>"Market Survey") 

:

0

나는 한 사용자가 많은 프로젝트가 있다면, 난 당신이 사용할 수 있다고 생각, 당신의 질문을 이해 있는지 확실하지 않습니다 :

@membership = Membership.find(:first, conditions: { user_id: x, project_id: y }) 
관련 문제