【问题标题】:Comparing a model before/after save with other models将保存前后的模型与其他模型进行比较
【发布时间】:2012-11-14 19:06:41
【问题描述】:

我很难理解这个问题。

我有一个模型(任务),它具有以下属性::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 回调中可用。

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

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

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby model callback


    【解决方案1】:

    作为我的回答的序言:我是新手。

    在沮丧了一段时间后,我开始观看 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
    

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

    【讨论】:

    • 性能真的不是 Rails 3 中的问题,所有这些链式方法都只是添加到 WHERE 子句中。查询实际上并没有运行,直到你用它做一些事情(即。@next.each do |next|)所以你应该没问题。
    • 好点,Magicmarkker。我记得 Ryan Bates 说过,由于 Rails 3 延迟加载(即查询返回 ActiveRecord::Relation 对象),在执行操作之前实际上没有任何查询,就像您提到的那样。就像我对 .last 和 .first 的调用一样。谢谢。
    猜你喜欢
    • 2023-04-11
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2017-09-05
    • 2015-11-14
    相关资源
    最近更新 更多