我正在使用Ruby on Rails,我正在存储这样的营业时间:
CREATE TABLE "business_hours" (
"id" integer NOT NULL PRIMARY KEY,
"business_id" integer NOT NULL FOREIGN KEY REFERENCES "businesses",
"day" integer NOT NULL,
"open_time" time,
"close_time" time)
(来自以下主题: Storing Business Hours in a Database)
现在我想把每周的每一天都拉出来并展示它们,我正试图找到最好的(或者至少是好的)方式。
我是否应该使用一个辅助方法来循环获取给定business_id的日期(从0..6开始)并将其分配给相关日期的变量?我觉得必须有一个更好的方法 - 使用数组或其他东西,但这会伤害我的想法,因为我也有一种'选择'的形式,其中给定的业务的任何时间可以立即更新
感谢任何指导!
答案 0 :(得分:2)
使用enum column plugin将日期字段声明为枚举字段。
class BusinessHours < ActiveRecord::Migration
def self.up
create_table :business_hours do |t|
t.integer :business_id, :null => false
t.enum :day, :limit =>[:sun, :mon, :tue, :wed, :thu, :fri, :sat], :nill => false
t.time :open_time, :null => false
t.time :close_time, :null => false
end
end
def self.down
drop_table :business_hours
end
end
现在,当您在BusinessHour模型上找到时,您将获得一天的字符串。
b = BusinessHour.find_by_business_id(2).first
p b.day.to_s.camelize #prints Sun/Mon/Tue etc.
您可以使用enum_select
和enum_radio
表单助手为枚举组创建列表框/单选按钮组:
答案 1 :(得分:0)
由于一周中的天数确实是固定的,您可以将表加入表6次(加上原始数据)并对单行进行查询。我可能只是做一个查询并循环遍历行。
答案 2 :(得分:0)
您是否考虑过serializing营业时间?使用序列化实际上是将对象存储在数据库中。
class BusinessHour < ActiveRecord::Base
serialize :hours
...
end
BusinessHour.create :business => @business, :hours =>
{:mon => [mon_start_time, mon_end_time], :wed => [wed_start_time, wed_end_time],
...}
就个人而言,我会采用linked question中描述的按位方法。你真正需要做的就是编写新的访问器方法。
答案 3 :(得分:-1)
找到业务并使用关联来检索business_hours行会更容易。
在您的视图中尝试此操作
<% @business.business_hours.each do |hrs| %>
<%= hrs.day_name %>: Open-<%= hrs.open_time %> Close-<%= hrs.close_time %>
<%- end -%>
在business_hour.rb模型文件中,创建默认范围以确保始终按顺序列出日期。您还可以创建day_name方法,以便更轻松地显示当天。
default_scope :order => 'day ASC'
def day_name
case self.day
when 0 then "Sun"
when 1 then "Mon"
...
end
end