1

前言:我是新手。

我以为我昨天已经解决了这个问题,但我开始怀疑我是否为这个领域设计了一个体面的模型。

我正在创建一个任务应用程序(基于我的工作)。这是我的第二次尝试(第一次,我没有进行测试,并且设计很糟糕,尽管它有效)。本质上,我想添加具有日期、开始和结束时间、装备(即 LCD 投影仪)等的任务。在创建任务时,我想查看当前是否存在具有相同房间/装备的先前任务(或前一天),并用注释更新前一个任务(:notes 是一列),说明稍后有任务在房间里。我还想检查是否有下一个任务具有相同的房间/装备,并想用有关下一个任务的信息更新当前任务。模型代码粘贴在下面:

class Task < ActiveRecord::Base
  attr_accessible :begin_time, :day, :end_time, :gear, :notes, :preset, :room, :setup, :strike
  before_create :initialize_linked_task_id
  before_save :check_for_adjacent_tasks

  validates :room, presence: true
  validates :begin_time, presence: true
  validates :end_time, presence: true
  validates :gear, presence: true
  validates :day, presence: true

  scope :for_day, lambda { |day| where(day: day) }
  scope :for_room, lambda { |room| where(room: room) }
  scope :with_gear, lambda { |gear| where(gear: gear) }

  private 

  def initialize_linked_task_id
    @linked_task_id = []
  end

  def check_for_adjacent_tasks
    @previous = prev?
    @next = next?

    unless @previous.nil?
      set_linked_task_id(@previous)
      @previous.update_attributes(notes: 
                              "There is a meeting in this room on #{self.day} at #{self.begin_time.strftime("%I:%M%P")}")
    end 
    unless @next.nil?
      set_linked_task_id(@next)
      self.notes = "There is a meeting in this room on #{@next.day} at #    {@next.begin_time.strftime("%I:%M%P")}"
    end
  end

  def prev?
    @prev = Task.for_day(self.day).for_room(self.room)
            .with_gear(self.gear)
            .where('begin_time < ?', self.begin_time).last
    if @prev.nil?
      @prev = Task.for_day(self.day.yesterday).for_room(self.room)
          .with_gear(self.gear).last
      return @prev unless @prev.nil?
    end

    @prev      
  end

  def next?
    @next = Task.for_day(self.day).for_room(self.room)
            .with_gear(self.gear)
            .where('begin_time > ?', self.begin_time).first
    if @next.nil?
      @next = Task.for_day(self.day.tomorrow).for_room(self.room)
          .with_gear(self.gear).first
      return @next unless @next.nil?    
    end

    @next
  end

  def set_linked_task_id(task)
    #@linked_task_id = task.id
  end
end

我不确定我是否应该像现在这样更新其他模型实例。我应该创建一个 Class 方法来更新其他实例吗?我应该在实例之间创建关系吗?

我也意识到代码中有重复。但我只想先正确完成这个概念。

编辑 为了澄清,只有上一个?方法不起作用。

4

0 回答 0