2012-11-30 2 views
1

나는 세 가지 모델, 계정, 사용자 및 연락처를 가지고 : 내 연락처 컨트롤러에서이 같은 사용자 레코드를 통해 새 연락처를 구축 범위를 시도하고has_many : 통해 구축

class User < ActiveRecord::Base 
    has_one :account 

    has_many :contacts, :through => :account 
end 

class Account < ActiveRecord::Base 
    belongs_to :owner, :class_name => 'User' 

    has_many :contacts 
end 

class Contact < ActiveRecord::Base 
    belongs_to :account 
end 

. 나는이 작업을 수행 할 때

def create 
    @contact = current_user.contacts.build(params[:contact]) 

    respond_to do |format| 
     if @contact.save 
     ... 
     else 
     ... 
     end 
    end 
end 

, 나는 연락처 레코드는 그러나 ACCOUNT_ID 열이 접촉에 설정되지 않은 데이터베이스에 저장되며,이 컬렉션이 너무 호출에 추가되지 않습니다, 어떤 오류가 발생하지 않습니다 @ current_user.contacts는 빈 콜렉션을 리턴합니다.

제안 사항? build를 사용

답변

0

메모리에 연락의 새로운 인스턴스를 만들지 만 수동으로 레코드 (예 : @contact.account_id = current_user.account.id)에 account_id를 설정하거나 아마의 연락처를 표시하는 데 사용되는 new 형태로 숨겨진 필드에서 설정해야 생성은 build 메서드에 전달 된 params 배열에서 선택됩니다.

accepts_nested_attributes_for이 도움이되는지 여부를 고려해 볼 수도 있습니다. 또 다른 옵션은 delegate을 사용하는 것일 수 있습니다. 두 경우 모두 사용하는 것과 반대가 될 수 있습니다 (일반적으로 "부모"에 정의 됨).

업데이트 : build 메서드는 사용자 인스턴스와 계정 (어쩌면 "Owner") 인스턴스에 모두 추가됩니다. 사용자와 연락처 사이에 다 대다 관계가 있으므로 계정과 연락처 간의 일대 다 관계. 그래서

@contact = current_user.accounts.contacts.build(params[:contact]) 

같은 당신이 계정의 빌드를 호출 할 필요가 생각 account_id이,이 일을합니까 얻으려면?

+0

톰에게 감사드립니다. 그래서 build가 작동하는 방식을 잘못 이해 한 것 같습니다. user.contacts.build를 호출하면 메모리 (인스턴스)에 이미 인스턴스 (인스턴스)가 부여되었지만 이미 해당 사용자 (또는 계정)에 할당되어 있다고 가정합니다. 가능한 경우 양식에서 계정 및 사용자 ID를 채우고 싶지 않기 때문에 중첩 된 attirbutes를 사용하지 않는 것이 좋습니다. – SirRawlins

+0

흠, 당신의 이해가 정확하다고 생각합니다. (423 번째 시간에이 문서를 읽었습니다 : http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html) 특히 "하나 이상을 반환합니다. 속성으로 인스턴스화되어 외래 키를 통해이 오브젝트에 링크되었지만 아직 저장되지 않은 콜렉션 유형의 새 오브젝트. " 이제 나는 더 조심스럽게 보였으므로, 나는이 문제를 보았다고 생각한다. 내 대답을 업데이트 할게. –

+0

감사합니다. Tom - 매우 잘 작동하는 것 같습니다. 나는 전혀 불만을 제기 할 수 없습니다. 고맙습니다. – SirRawlins

관련 문제