2014-04-23 2 views
0

관련 모델이 2 개이므로이를 검증하고 함께 만들어야합니다. 그것이 가능했던 경우관련 모델 유효성 확인 및 저장

응용 프로그램

class Application < ActiveRecord::Base 
    has_many :application_sessions, inverse_of: :application 

ApplicationsSession

class ApplicationSession < ActiveRecord::Base 
    belongs_to :application, inverse_of: :application_sessions 


  1. 나는 LIK 것 전자는 ApplicationSession을 통해 Application을 만들지 만 application_session.build_application은 유효한 레코드가 아니기 때문에 작동하지 않습니다.

  2. application_session.create_applicationApplicationSession이 유효한 레코드가 아니더라도 Application이 생성됩니다.

첫 번째 경우; ApplicationApplicationSession의 유효성을 검사합니다. 이 논리는 Application이 유효한 레코드 인 경우에만 ApplicationSession에 대한 application_id 유효성 검사를 건너 뛰면 정상적으로 작동합니다. 아직도 나는 더 우아한 해결책을 사용하는 것을 선호한다.

두 번째 것; ApplicationSession이 유효한 레코드가 아니지만 나중에이 솔루션이 마음에 들지 않으면 나중에 Application을 삭제할 수 있습니다.


Rails와 함께 이러한 종속 레코드를 만들거나 만들지 않는 가장 좋은 방법은 무엇입니까?



명확한 설명 : 존재 부모 및 (유효 그것이 어떤이없는 기대 을 저장에 대한 올바른 자녀가없는 상태

간단히, 내가 함께 생성 될 수있는 부모와 자식을 원하는 부모). 하위 레코드가 유효한 레코드가 아닌 경우에는 아무것도 만들어야하지 않습니다.

답변

1

저는 새로운 것을 사용하고 빌드하면 효과가 있다고 생각합니다.

application = Application.new({attr1: val1, attr2: val2 ..}) 
application.application_sessions.build({attr1: val1, attr2: val2 ..}) 
application.save 

이렇게하면 응용 프로그램이 유효하지 않으면 응용 프로그램과 새 application_session이 저장되지 않습니다. application_session이 유효하지 않은 경우에도 마찬가지입니다. 부모의 응용 프로그램과 새로운 application_session 모두 유효한 경우

(0.1ms) begin transaction 
(0.1ms) rollback transaction 

, 모두 저장됩니다 :)

0

데이터 모델링의 관점에서 나는 당신이 무엇을 하려는지 확실하지 않습니다.

부모님이 선택 사항 인 부모/자녀 관계가 있다고 생각하십니까?

부모를 만든 다음 삭제하면 아무 것도 가리 키지 않는 자식에 매달린 키가 생기고 거기에 null이 있어야합니다.

새 부모를 호출하거나 null 부모 ID로 만들 수없는 이유가 있습니까? 부모 키는 필수입니까? 그렇다면 필수 요구 사항을 끄면 작동해야합니다. 빌드는 부모에서 자식으로 만 작동하며 모든 키가 null 일 때 반올림하지 않습니다. 나는 당신이 부모에게 save를 호출해야한다고 생각하고 부모 ID가 알려지면 자식은 저장된다.

앱이 작동하도록 부모가 있어야하는 경우 더미 그룹을 만들고 특정 하위 항목을 소유하고 싶지 않은 모든 하위 항목이 있으면 쉽게 다시 찾을 수 있습니다.앱의 흐름을 알지 못하면 내가 무엇을 조언 할 수 있는지 잘 모르겠습니다.

+0

존재 : 당신이 해고 업 당신의 rails console 명령을 터미널에서

, 당신은 같은 것을 볼 것입니다 필수이다. 것은이다; 부모는 처음 생성 된 자식이 유효한 경우에만 존재해야합니다. 따라서 부모를 만들기 전에 자녀를 확인해야합니다. 만약에 가능하다면. 하지만 부모님이 없으면 아이는 항상 잘못된 기록이 될 수 있기 때문에 그렇게 할 수는 없습니다. –

+0

어떤 경우에 ... 거래를 사용하십시오 :) 아이가 유효하지 않은 경우 롤백하십시오. – Ghoti

+0

트랜잭션이 작동했지만 아마도 이런 종류의 문제에 대한 최상의 솔루션이 아닙니다. 게다가 컨트롤러가 복잡해졌습니다. 첫 번째 솔루션을 구현하고 테스트 결과 코드가 잘 수행되고 코드가 읽기 쉽다고 말합니다. 더 단순하고 비 해킹 된 솔루션이 있다면 여전히 행복 할 것입니다. –