2012-11-14 56 views
0

我在繞過這個過程中遇到了麻煩。將模型與其他模型保存前/保存後進行比較

我有一個模型(任務),它具有屬性::day,:room,:begin_time,:end_time,:gear,:notes和其他(不相關)。我在Task模型的遷移集中也有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 

無論我創建一個新的任務或更新一個新的,我想:

檢查前面和後面的任務(基於: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回調中可用。

我可以創建一個類自我排序到當前任務列表中的類方法。

我不想找人爲我編碼,但我對我應該採取的方法感到困惑。

謝謝。

回答

0

前言我的回答:我是新手。

經過一段時間的沮喪之後,我開始看RailsCasts,從昨晚離開的地方開始收看。我想起了(看一個關於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

在rails 3中,性能確實不是問題,所有這些鏈接方法都只是添加到WHERE子句中。查詢實際上並沒有運行,直到你對它做了什麼(即。@ next.each do | next |)所以你應該沒問題。 – Magicmarkker

+0

好點,Magicmarkker。我記得Ryan Bates說,因爲rails 3延遲加載(即查詢返回ActiveRecord :: Relation對象),所以直到一個動作纔會被查詢,就像你提到的那樣。就像我對.last和.first的調用一樣。謝謝。 – douglas