我想实现一个商店的开业时间模式。
目前我有
Class Store
has_one :opening_table
#return opening_times as an array
def opening_times
self.build_opening_table unless opening_table
(0..6).collect{ |i|
[opening_table.read_attribute("open_#{i}"),opening_table.read_attribute("close_#{i}") ]
}
end
def opening_times=(attr)
self.build_opening_table unless opening_table
i=0
attr.each do |el|
opening_table.attributes= {"open_#{i}".to_sym => el[0]}
opening_table.attributes= {"close_#{i}".to_sym => el[1]}
i=i+1
end
end
和OpeningTable有字段open_0, close_0表示星期一的开放和关闭时间
create_table :opening_tables do |t|
t.references :advertisement, :null=>false
(0..6).each do |i|
t.integer "open_#{i}"
t.integer "close_#{i}"
end
t.timestamps
end
我对这个解决方案感到不舒服和灵活,但是我没有一个更好的方法来实现它
您可以创建另一个名为Schedule
的表
create_table :schedules do |t|
t.integer 'open'
t.integer 'close'
t.integer store_id
t.timestamps
end
然后使存储为has _many :schedules
可以访问Store.first.schedules[0].open
等等
编辑:对于嵌套属性,您只需通过store.schedules[0]
或者您可以添加到schedules
表:
t.string :week_day
,然后做store.schedules.find_by_week_day("monday")
validate :has_seven_schedules
...
def has_seven_schedules
self.schedules.count == 7 ? true : false
end
EDIT2:
如果你愿意,你可以把find_by_week_day("monday")
放在store内的方法上。Rb模型,如:
def opening_time(day)
schedule = self.schedules.find_by_week_day(day)
unless schedule.nil?
return schedule.open
end
end
对于closing_time.