Ruby on rails 将保存之前/之后的模型与其他模型进行比较

Ruby on rails 将保存之前/之后的模型与其他模型进行比较,ruby-on-rails,ruby,model,callback,Ruby On Rails,Ruby,Model,Callback,我对这件事很难理解 我有一个模型(任务),它的属性是::day、:room、:begin_time、:end_time、:gear、:notes和其他(不相关的)属性。在任务模型的迁移集中,我还有一个链接的任务属性。我有这些相关的范围(我将其链接在一起): 无论是创建新任务还是更新新任务,我都希望: 检查private instance methods prev中的上一个和下一个任务(基于:begin_time)?接下来呢?。如果有以前的任务,我希望更新其:注释并将该任务添加到:linked_t

我对这件事很难理解

我有一个模型(任务),它的属性是::day、:room、:begin_time、:end_time、:gear、:notes和其他(不相关的)属性。在任务模型的迁移集中,我还有一个链接的任务属性。我有这些相关的范围(我将其链接在一起):

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

检查private instance methods prev中的上一个和下一个任务(基于:begin_time)?接下来呢?。如果有以前的任务,我希望更新其:注释并将该任务添加到:linked_task_id;如果有下一个任务,我想用下一个任务的信息设置self.notes并将其添加到:linked_task_id。如果当天(如上)、前一天或第二天没有任何任务,我将返回nil

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

@self_id = @tasks_on_same_day.index(self)
并使用该索引更新上一个或下一个任务的_属性。问题是,我认为新创建的任务或更新的任务(即,我更新开始时间)不会在before_save回调中可用

我可以创建一个类方法来将self排序到当前任务的列表中

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


谢谢。

作为我回答的前言:我是个新手

在经历了一段时间的挫折之后,我开始看《铁路乘客》,从昨晚结束的地方继续往下看。我(看了一段关于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
@previous=Task.for_-day(self.day).for_-room(self.room).带_-gear(self.gear).where('begin_-time<?'self.begin_-time).最后
@下一步=任务。对于天(self.day)。对于房间(self.room)。使用装备(self.gear)。何处('begin\u time>?'self.begin\u time)。首先

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

rails 3中的性能实际上不是问题,所有这些链接方法都只是添加到WHERE子句中。在你对它做点什么之前(例如@next.each do | next |),查询实际上都不会运行,所以你应该没事。说得好,Magicmarker。我记得Ryan Bates说过,由于rails 3的延迟加载(即查询返回ActiveRecord::Relation对象),在执行操作之前,实际上不会查询任何内容,如您所述。就像我给你打电话一样,最后一个也是第一个。非常感谢。
@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