我在繞過這個過程中遇到了麻煩。將模型與其他模型保存前/保存後進行比較
我有一個模型(任務),它具有屬性::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回調中可用。
我可以創建一個類自我排序到當前任務列表中的類方法。
我不想找人爲我編碼,但我對我應該採取的方法感到困惑。
謝謝。
在rails 3中,性能確實不是問題,所有這些鏈接方法都只是添加到WHERE子句中。查詢實際上並沒有運行,直到你對它做了什麼(即。@ next.each do | next |)所以你應該沒問題。 – Magicmarkker
好點,Magicmarkker。我記得Ryan Bates說,因爲rails 3延遲加載(即查詢返回ActiveRecord :: Relation對象),所以直到一個動作纔會被查詢,就像你提到的那樣。就像我對.last和.first的調用一樣。謝謝。 – douglas