Ищете лучший способ извлечь рабочие часы из базы данных - PullRequest
3 голосов
/ 18 февраля 2010

Я использую 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)

(который пришел из потока по адресу: Хранение рабочих часов в базе данных )

Теперь я хочу вывести часы для каждого дня недели и отобразить их, и я пытаюсь найти лучший (или, по крайней мере, хороший) способ.

Должен ли я просто иметь вспомогательный метод, который будет циклически получать дни (от 0..6) для данного business_id и назначать его переменной для соответствующего дня? Я чувствую, что должен быть лучший способ - с массивом или чем-то, но мне больно думать об этом, потому что у меня также есть форма выбора, где любой час для данного бизнеса может быть обновлен сразу .

Спасибо за любые советы!

Ответы [ 4 ]

2 голосов
/ 18 февраля 2010

Используйте плагин enum column , чтобы объявить поле дня как поле enum.

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 для создания списка / группы переключателей для группы enum:

0 голосов
/ 19 февраля 2010

Было бы проще найти бизнес и использовать ассоциации для получения строк 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
0 голосов
/ 18 февраля 2010

Рассматривали ли вы сериализацию рабочих часов? Используя сериализацию, вы по существу храните объекты в базе данных.

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],
   ...}

Лично я бы пошел с побитовым подходом, описанным в связанном вопросе . Все, что вам действительно нужно сделать, чтобы это заработало, - это написать новые методы доступа.

0 голосов
/ 18 февраля 2010

Поскольку число дней в неделе действительно фиксировано, вы можете присоединиться к таблице 6 раз (плюс оригинал) и выполнить запрос для одной строки. Я бы, наверное, просто сделал один запрос и перебрал бы строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...