Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stockeriez-vous les heures d'ouverture d'une entreprise dans la base de données/modèle d'une application Rails ?

Je suis actuellement en train de configurer une liste d'annuaires pour un client et nous voulons donner plus de flexibilité à l'utilisateur. Donc :laissez l'utilisateur configurer des blocs pendant des jours :

Nous avons une journée (entier 1-7), ouvre (heure), ferme (heure) et certains magasins ou sites ont des heures d'ouverture d'été et d'hiver, ou ils font des vacances. Selon schema.org vous devez ajouter un valid_from (datetime) et un valid_through (datetime).

Avec cette configuration, l'utilisateur peut créer ce qu'il veut :

# migration
class CreateOpeningHours < ActiveRecord::Migration
  def change
    create_table :opening_hours do |t|
      t.integer :entry_id # your model reference
      t.integer :day
      t.time :closes
      t.time :opens
      t.datetime :valid_from
      t.datetime :valid_through
    end
  end
end

Exemple pour le modèle :

class OpeningHour < ActiveRecord::Base

  belongs_to :entry

  validates_presence_of :day, :closes, :opens, :entry_id
  validates_inclusion_of :day, :in => 1..7
  validate :opens_before_closes 
  validate :valid_from_before_valid_through 

  # sample validation for better user feedback
  validates_uniqueness_of :opens, scope: [:entry_id, :day]
  validates_uniqueness_of :closes, scope: [:entry_id, :day]

  protected
  def opens_before_closes
    errors.add(:closes, I18n.t('errors.opens_before_closes')) if opens && closes && opens >= closes
  end

  def valid_from_before_valid_through
    errors.add(:valid_through, I18n.t('errors.valid_from_before_valid_through')) if valid_from && valid_through && valid_from >= valid_through
  end

end

Avec cette configuration, vous pouvez créer facilement un is_open ? méthode dans votre modèle. Actuellement, je n'ai pas configuré is_open? méthode, mais si quelqu'un a besoin, donnez-moi un coup! Je pense que je vais le finir dans les prochains jours.