0

我有一张桌子Schedules可以存放一天的Person工作。现在我想添加这个Person工作的时间。假设Person周一从上午 9 点到 11 点工作,周二从上午 9 点到下午 6 点,依此类推......

同样在每个日期范围内(从 start_time 到 end_time ),我如何设置 Person 不像午餐时间那样工作的时间?

  create_table "schedules", :force => true do |t|
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
    t.integer  "person_id"
    t.boolean  "sun"
    t.boolean  "mon"
    t.boolean  "tue"
    t.boolean  "wed"
    t.boolean  "thu"
    t.boolean  "fri"
    t.boolean  "sat"
  end  

我应该创建第二个表来存储每天的时间吗?

4

2 回答 2

1

我认为建模一个人的工作时间表会更好地作为一对多:

Person
  has_many :shifts
end

Shift
  #fields person_id, day, start_time, end_time
  belongs_to :person
end

然后,要创建您描述的时间表('星期一从上午 9 点到上午 11 点,星期二从上午 9 点到下午 6 点,依此类推......'):

@person = Person.find(1)
@person.shifts.create!(:day => 'mon', :start_time => '9 am', :end_time => '11 am')
@person.shifts.create!(:day => 'tue', :start_time => '9 am', :end_time => '6 pm')

当您想显示此信息时,只需遍历 Person 的 Shifts:

@person.shifts.each do |s|
 puts "#{@person.name} works on #{s.day} from #{s.start_time} to #{s.end_time}."
end

您可以选择简单地模拟“午休”,让 Person 当天轮班两班。例如,如果他们从上午 9 点工作到晚上 7 点,从下午 1 点开始休息一小时,那么让他们在当天从上午 9 点到下午 1 点轮班,从下午 2 点到晚上 7 点轮班。

于 2013-02-06T21:20:28.677 回答
1

您可以在 Person 和 Days (例如)之间创建一个 ref 表,其中包括 Time 和无论何时工作的标志。

于 2013-02-06T20:43:51.017 回答