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

无论我是创建新任务还是更新新任务,我都希望:

在私有实例方法 prev 中检查上一个和下一个任务(基于 :begin_time )?接下来呢?如果有以前的任务,我想更新它的 :notes 并将该任务添加到 :linked_task_id; 如果有下一个任务,我想用关于下一个任务的信息设置 self.notes 并将其添加到:linked_task_id。如果当天(上)、前一天或后天没有任何任务,我将返回 nil。

前天和后天很简单,因为我会得到前一天的最后一个任务(如果存在的话)或第二天的第一个任务。如果当天有多个任务,我希望能够将任务排序以轻松找到上一个和下一个任务,即

@self_id = @tasks_on_same_day.index(self)

并使用该索引来更新上一个或下一个任务的属性。问题是,我不认为新创建的任务或更新的任务(即,我更新了 begin_time)将在 before_save 回调中可用。

我可以创建一个类方法来将自己分类到当前任务列表中。

我不是在找人为我编写这个代码,但我对我应该采取的方法感到困惑。

谢谢。

4

1 回答 1

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

这非常容易。为了使这个问题有用,像这样的长查询字符串对性能有什么影响?

于 2012-11-14T20:47:17.050 回答