前言:我是新手。
我以为我昨天已经解决了这个问题,但我开始怀疑我是否为这个领域设计了一个体面的模型。
我正在创建一个任务应用程序(基于我的工作)。这是我的第二次尝试(第一次,我没有进行测试,并且设计很糟糕,尽管它有效)。本质上,我想添加具有日期、开始和结束时间、装备(即 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 方法来更新其他实例吗?我应该在实例之间创建关系吗?
我也意识到代码中有重复。但我只想先正确完成这个概念。
编辑 为了澄清,只有上一个?方法不起作用。