2014-06-15 5 views
1

모델 ProjectQueue 사이에 레일스 연결이 있습니다. 프로젝트 has_many 대기열. 대기열에 프로젝트가 있어야하며 결과적으로 project_id에 대한 존재 확인이 있습니다.레일스 ActiveRecord :: 연관성 확인을위한 적절한 방법?

대기열을 사용하여 새 프로젝트를 만들고 싶습니다. 예를 들어,이 같은 일이 :

project = Project.new(valid: param, options: here) 
project.queues << Queue.new(other_valid: param, options: here) 
project.save! 

으로 저장 큐는 PROJECT_ID 존재 확인에 실패하기 때문에 실패 할 것입니다.

내 일상적인 추악한 방법은 프로젝트를 작성한 다음 대기열을 추가하고 트랜잭션에서 전체를 랩핑하여 프로세스의 일부가 실패하면 롤백하는 것입니다. ... 여하튼 그것은 그것이 있어야하는 것보다 더 추악한 것처럼 보인다.

따라서 현재 상태 확인을 수행하지 않고도 새 프로젝트에서 큐를 만드는 더 좋은 방법이 있습니까? 그렇지만 여전히 해당 큐에 프로젝트가 있어야한다고 주장합니까?

건배

+0

, 자동으로 할당해야 해당 큐에 대한 project_id. 그게 실패 할 것이라 확신합니까? –

답변

2

시도는 다음과 같이 당신의 큐 협회에 build 방법을 사용하려면 :

project = Project.new(valid: param, options: here) 
project.queues.build(other_valid: param, options: here) //this will build the queue and set its project_id to your current project. 
project.save! 

은 그냥 PROJECT_ID는, 올바른 값이 있는지 확인하기 위해 project.save! 삽입이 라인을 호출하기 전에 :

project.queues.each do |queue| 
    puts queue.project_id 
end 

그래서 당신과 무슨 일이야 r 코드?

project = Project.new(valid: param, options: here) //build a new project - this is not yet persisted, so your id column is nil 
project.queues << Queue.new(other_valid: param, options: here) // this line tries to save the queue to the database, does not wait for you to call project.save! 
project.save! 

당신이 호출 할 때 :

project.queues << Queue.new(other_valid: param, options: here)` 

레일 데이터베이스에 새 큐를 저장하려고하지만, 프로젝트가 저장되지 않기 때문에, queue.project_id은 그래서 당신의 큐 검증이 실패 전무하다.

데이터베이스 (유지 된 프로젝트)에서 가져온 프로젝트와 비슷한 것을 시도하면 오류없이 코드가 작동합니다.

당신은 여전히 ​​비슷한 것을 사용과 같이, 그 위에 새로운 큐를 추가하기 전에 프로젝트를 저장하려면 : project.queues에 큐를 할당 할 때

코드에서
project = Project.new(valid: param, options: here) 

if project.save 
    project.queues << Queue.new(other_valid: param, options: here) //this guarantees that project_id exists 
end 
관련 문제