2013-03-22 1 views
1

저장된 개체 배열 Person에 저장하지 않은 ActiveRecord 개체 Thing을 적용하려고합니다.지연된 작업 : 저장되지 않은 ActiveRecord 개체를 다른 것으로 적용하십시오.

person has_many :things 

그러나 지연된 작업은 저장되지 않은 ActiveRecord 모델과 작동하지 않습니다.

DJ isn't intended to work with unsaved ActiveRecord models.

https://github.com/collectiveidea/delayed_job/wiki/Common-problems#wiki-DJ_doesnt_deserialize_an_unsaved_ActiveRecord_model

... 그래서 오류를 해결하기 수 없습니다 :

{ActiveRecord::RecordNotFound, class: Thing , primary key: 

를 내가 얻을 수있는 몇 가지 전략을 중심으로 발로 봤는데 나는 그들이 나에게 말했다 때문에 알고 주위 :

1) self.yaml_new를 here에서 재정의하십시오. 끔찍한 생각처럼 들리네.

2) Thing.find을 복구 할 수 없도록 설정하고 저장되지 않은 물체 만 수분을 보충하십시오. # 1보다 더 나쁜 생각입니다.

3) Thing을 먼저 db에 저장하십시오. 우리가 작업을 정리해야하는 db에 고아 Thing이있을 것이므로 (Thing은 실제로는 Person이 첨부되지 않고 존재하지 않음), 작업 호출자는 Thing을 먼저 저장해야한다는 것을 알고 있어야합니다. Person에 대한 유효성 검사를 무시해야합니다. 끔찍해.

4) DJ 직렬화를 위해 OpenStruct에 AR 세부 정보를 덤프 할 Thing.to_open_struct 메서드를 만듭니다. 지저분 해. 이 방법을 모든 마이그레이션과 동기화하여 유지해야합니다. 이상적은 아니지만 내가 가지고있는 최고입니다.

아이디어가 있으십니까? 저장하지 않은 DJ를 직렬로 설정하지 않았습니다. Thing 그냥 깨끗한 솔루션을 원합니다.

답변

2

하나의 아이디어는 UnsavedThing이라는 새로운 테이블/모델을 만드는 것입니다.이 테이블/모델에는 연관이 없지만 기본적으로 Thing과 동일합니다.

DJ는 UnsavedThing을 찾아서 Thing.new를 호출하고, Thing.save를 호출 한 다음 UnsavedThing.destroy를 호출합니다.

그다지 우아하지 않지만 대안도 훌륭하지 않습니다.

왜 먼저 저장할 수없는 이유가 무엇입니까? 클래스가 상호 작용하는 방식과 Thing이 저장 될 수있는 기준에 대한 더 많은 컨텍스트를 제공 할 수 있다면 더 나은 해결책이 될 수 있습니다.

+0

Re : "왜 먼저 저장할 수 없습니까?" 나는 더 이상 질문을 혼란스럽게하고 싶지 않았다. 우리가 할 수 없다고 그냥 말하자. 다른 모델에 대한 아이디어에 감사드립니다. 나쁘지 않다. 나는 그것에 대해 조금 생각할 것이다. – gmoore

관련 문제