我的模型设计是否在正确的道路上?

时间:2012-11-15 20:34:50

标签: ruby-on-rails activerecord models

前言:我是新手。

我以为我昨天解决了这个问题,但我开始怀疑自己是否为这个领域设计了一个设计合理的模型。

我正在创建一个Task应用程序(基于我的工作)。这是我的第二次回合(第一次,我没有测试,并且设计不好,虽然它有效)。基本上我想添加具有日期,开始和结束时间,装备(即LCD投影仪)等的任务。在创建任务时,我想查看当前是否存在具有相同房间/装备的先前任务(或前一天),并使用注释(:注释是一列)更新上一个任务,表示任务稍后在房间中。我还想检查是否存在具有相同房间/装备的下一个任务,并且想要使用关于下一个任务的信息来更新当前任务。粘贴在下面的型号代码:

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方法来更新其他实例吗?我应该在实例之间建立关系吗?

我也意识到代码中存在重复。但我只是想首先正确地完成这个概念。

修改 澄清一下,只有上一篇?方法不起作用。

0 个答案:

没有答案