寻找从数据库中检索营业时间的最佳方法

时间:2010-02-18 00:27:23

标签: ruby-on-rails ruby sqlite

我正在使用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开始)并将其分配给相关日期的变量?我觉得必须有一个更好的方法 - 使用数组或其他东西,但这会伤害我的想法,因为我也有一种'选择'的形式,其中给定的业务的任何时间可以立即更新

感谢任何指导!

4 个答案:

答案 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_selectenum_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