2012-11-14 3 views
0

이 문제를 해결하는 데 어려움이 있습니다.다른 모델과 저장하기 전과 후의 모델 비교

: 일, : 방, : begin_time, : end_time, : 기어, : 메모 및 기타 (관련이없는) 특성을 가진 모델 (작업)이 있습니다. 또한 작업 모델에 설정된 마이그레이션에서 linked_id_task 특성이 있습니다. (이전 및 다음 작업을위한

확인 :

scope :for_day, lambda { |day| where(day: day) } 
scope :for_room, lambda { |room| where(room: room) } 
scope :with_gear, lambda { |gear| where(gear: gear) } 
@tasks_on_same_day = Task.for_day(self.day).for_room(self.room).with_gear(self.gear).all 
@task_on_previous_day = Task.for_day(self.day.yesterday).for_room(self.room).with_gear(self.gear).last 
@task_on_next_day = Task.for_day(self.day.tomorrow).for_room(self.room).with_gear(self.gear).first 

나는 새 작업을 만들거나 새로운 하나를 통해 업데이트 여부, 내가 원하는 : 그리고 (내가 함께 체인)이 해당 범위를 가지고 based on : begin_time) 개인 인스턴스 메서드 prev? 그리고 다음?. 이전 작업이있는 경우 해당 메모를 업데이트하고 해당 작업을 : linked_task_id; 다음 작업이 있으면 self.notes를 다음 작업에 대한 정보와 함께 설정하여 linked_task_id에 추가하려고합니다. 현재 날짜 (위), 전날 또는 다음 날에 작업이 없으면 아무 것도 반환하지 않습니다.

전날의 마지막 작업 (있는 경우) 또는 다음 날의 첫 번째 작업을 얻으므로 이전과 다음 날은 간단합니다. 현재 하루에 여러 작업이있는 경우에, 나는 쉽게 이전 및 다음 작업을 찾을에서 분류 작업을 할 수 즉

@self_id = @tasks_on_same_day.index(self) 

을 원하고 이전 또는 다음 작업의 update_attributes에 해당 인덱스를 사용합니다. 문제는 새로 생성 된 작업 또는 업데이트 된 작업 (즉, begin_time을 업데이트 함)이 before_save 콜백에서 사용 가능하지 않다고 생각합니다.

나는 self를 현재 날짜 작업 목록으로 정렬하는 클래스 메서드를 만들 수 있습니다.

나는 이것을 코딩하는 사람을 찾고 있지는 않지만, 내가 취해야 할 접근법에 대해 혼란 스럽다.

감사합니다.

답변

0

내 대답을 서두르는 것 : 나는 초보자입니다.

잠시 좌절당한 후, 나는 RailsCast를보고 시작했다. 그리고 그것은 내가 바보임을 (ActiveRecord 질의에 관한 비디오를 보면서) 나에게 떠올랐다.

난 아직이 시도하지 않은,하지만 난 그냥 ... 뭔가 등에 놀라 울 정도로 쉽게

@previous = Task.for_day(self.day).for_room(self.room).with_gear(self.gear).where('begin_time < ?' self.begin_time).last 
@next = Task.for_day(self.day).for_room(self.room).with_gear(self.gear).where('begin_time > ?' self.begin_time).first 

을 조회 할 수 있습니다. 이 질문을 유용하게 사용하려면 긴 쿼리 문자열의 성능 효과는 어떻습니까?

+0

성능은 레일 3에서 실제로 문제가되지 않습니다. 모든 체인화 된 메소드는 WHERE 절에 추가됩니다. 당신이 그것으로 무언가를 할 때까지 (즉, @ next.each do | next |) 쿼리는 실제로 실행되지 않습니다. – Magicmarkker

+0

좋은 지적, Magicmarkker. Ryan Bates는 3 개의 지연로드 (예 : 쿼리가 ActiveRecord :: Relation 객체를 반환 함) 때문에 실제로 언급 할 때까지 아무 것도 실제로 쿼리되지 않는다고 말했습니다. .last와 .first에 대한 나의 전화처럼. 고맙습니다. – douglas

관련 문제