2010-01-11 4 views
8

두 모델레일스 - has_one 및 belongs_to 관계에 대해 build_association이 작동하지 않습니다.

class Subscription < ActiveRecord::Base 
    belongs_to :client 
end 

class Client < ActiveRecord::Base 
    has_one :subscription 
end 

있지만 부모로부터 자식 만들려고 할 때 예 : sub.build_client 외래 키가 설정되지 않습니다.

>> sub = Subscription.new 
=> #<Subscription id: nil, token: nil, user_id: nil, created_at: nil, updated_at: nil, cancelled: nil, active: nil, client_id: nil> 
>> sub.save(false); 
?> client = sub.build_client 
=> #<Client id: nil, server_id: nil, ip: nil, created_at: nil, updated_at: nil> 
>> client.save(false) 
=> true 
>> sub.client_id 
=> nil 
>> sub 
=> #<Subscription id: 4, token: nil, user_id: nil, created_at: "2010-01-11 06:07:45", updated_at: "2010-01-11 06:07:45", cancelled: nil, active: nil, client_id: nil> 

내가 client.build_subscription

?> client = Client.new 
=> #<Client id: nil, server_id: nil, ip: nil, created_at: nil, updated_at: nil> 
>> client.save(false) 
=> true 
>> sub = client.build_subscription 
=> #<Subscription id: nil, token: nil, user_id: nil, created_at: nil, updated_at: nil, cancelled: nil, active: nil, client_id: 4> 
>> sub.save(false) 
=> true 
>> sub 
=> #<Subscription id: 5, token: nil, user_id: nil, created_at: "2010-01-11 06:09:32", updated_at: "2010-01-11 06:09:32", cancelled: nil, active: nil, client_id: 4> 
>> client 
=> #<Client id: 4, server_id: nil, ip: nil, created_at: "2010-01-11 06:09:02", updated_at: "2010-01-11 06:09:02"> 
>> ^C 
?> client = Client.new 
=> #<Client id: nil, server_id: nil, ip: nil, created_at: nil, updated_at: nil> 
>> client.save(false) 
=> true 
>> sub = client.build_subscription 
=> #<Subscription id: nil, token: nil, user_id: nil, created_at: nil, updated_at: nil, cancelled: nil, active: nil, client_id: 4> 
>> sub.save(false) 
=> true 
>> sub 
=> #<Subscription id: 5, token: nil, user_id: nil, created_at: "2010-01-11 06:09:32", updated_at: "2010-01-11 06:09:32", cancelled: nil, active: nil, client_id: 4> 
>> client 
=> #<Client id: 4, server_id: nil, ip: nil, created_at: "2010-01-11 06:09:02", updated_at: "2010-01-11 06:09:02"> 
>> ^C 

Ive는 3 시간 동안 열중하여 아무데도 빨리 빠져 나간다. 누구나 내가 잘못하고있는 것들을 설명 할 수 있을까? 등등

답변

9

모델 연결에 따르면 SubscriptionClient의 하위입니다.

먼저 구독을 만든 다음 첫 번째 예제에 따라 클라이언트를 만드는 경우 Rails는 subscriptions 테이블에 외래 키 값을 client_id 외부 키 값으로 설정하지 않습니다. 클라이언트 레코드를 만들지 않았으므로 구독과 연결할 것이 없습니다. 따라서 부모 레코드 (예 : 클라이언트)를 먼저 생성 한 다음 build_subscription 메소드를 사용하여 하위 구독 레코드와 연결해야합니다.

+0

감사합니다 존, 나는 이것이 (레일 가이드를 참조했지만 couldnt이 이렇게 stackoverflow에 여기에서 확인하고 싶다는 설명을 찾은 경우)라고 생각했습니다. 그러나 어떻게 has_many가이 관계가 될 수 있는지에 속합니다. – robodisco

+0

난 그냥 거기에 빌드 방법은 왜 할 수 없다면 생각뿐만 아니라? foreign_id를 설정하지 못하면이 관계에서 해당 메소드의 용도는 무엇입니까? – robodisco

+1

좋은 질문입니다. –

1

내가 많은 유사한 연관성을 가지고 있지만, 나는 종종 null로 CLIENT_ID 설정 금지, 그래서 부모 개체없이 자식 개체를 만들 수 없습니다 :

은 읽어.

시도 :

sub = Subscription.new 
sub.build_client 
sub.save 

그것은 생성하고 오브젝트를 모두 저장합니다.

0

설명 중 하나에서 build_client 메소드가있는 이유를 묻습니다. 클라이언트를 저장 한 다음 하위에 CLIENT_ID을 검사 할 때, 그것은 전무이지만, 또한

sub.save(validate: false) 

라고하고 하위에 CLIENT_ID을 확인 당신이했을 경우, 그것은 존재하는 것입니다. 따라서 추가 저장이 필요하지만 하위 키에 외래 키를 설정하는 마법은 여전히 ​​있습니다.

1

이 문제는 Rails 4.2.5 또는 이전 버전에서 수정 된 것으로 보입니다. (나는 가장 오래된 버전이 무엇인지 모르지만 4.2.5 만 테스트했다.)

부모 레코드가 삽입 된 후 부모 레코드가 삽입되면 업데이트가 자동으로 실행되어 부모 레코드의 아이디.

그러나이 동작, 관련 코드 또는 자동화 된 테스트에 대한 문서를 찾을 수 없으므로 고의적으로 수정되었으며이 동작에 의존해야하는지 잘 모르겠습니다. 다른 해법의 해결책을 고집하는 것이 가장 좋습니다.

또한 레일스 4.2.5에서 has_many에 대해 여전히 깨진 인 것으로 보입니다.

관련 문제