Rails — метод возврата, если продавец открыт

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

У меня есть модель продавца. Модель accepts_nested_attributes для модели рабочего времени.

Модель продавца

 class Merchant < ApplicationRecord
  has_many   :working_hours, inverse_of: :merchant, dependent: :destroy
  accepts_nested_attributes_for :working_hours, reject_if: :all_blank, allow_destroy: true
end
  

Модель рабочего времени

 class WorkingHour < ApplicationRecord
  belongs_to :merchant 
end
  

Таблица working_hours имеет:

 class CreateWorkingHours < ActiveRecord::Migration[5.0]
  def change
    create_table :working_hours do |t|
      t.integer :day
      t.time :open_time
      t.time :close_time
      t.references :merchant, foreign_key: true
      t.timestamps
    end
  end
end
  

У продавцов может быть более одного блока working_hour в день
например: с 8:00 до 12:00 / с 15:00 до 18:00.

Я хочу создать метод для возврата, если продавец открыт или закрыт. Как я могу это сделать?

Комментарии:

1. Найдите все рабочие часы поставщика — получите текущий час — просматривайте записи, пока не обнаружите, что текущий час находится между временем открытия и закрытия записей — если вы не получите положительный результат — поставщик закрыт (у меня была дурацкая идея, связанная с преобразованием всех записейв массив чисел, которые поставщик открыт, но это не имеет смысла) — быстрый вопрос — день недели не имеет значения?

2. Да, день недели — это день в таблице целочисленных данных (от 0 до 6). Я думал сделать что-то подобное, но прежде чем перебирать записи, пока вы не дойдете до текущего дня недели и после текущего времени. Но я довольно новичок в ROR / ruby. Я не понял, как я могу это сделать. Что-то вроде Time.current. wday == working_hour. день open_time < Time.current amp;amp; Time.current > close.time

3. На самом деле — я бы рассмотрел руководство rails по запросам здесь . На самом деле, я думаю, вам просто нужен простой запрос, который проверяет, открыт ли поставщик в этот день, и есть ли у какой-либо из этих записей час

Ответ №1:

Обновление Мы должны были потерять self. часть

попробуйте добавить это в свою торговую модель

 def open?
    self.working_hours.any? { |wh|
        (wh.open_time.hour..wh.close_time.hour).cover?(Time.current.hour)
    }
end
  

Комментарии:

1. Вам не нужно явно возвращать true и false

2. Time.current не возвращает часовой пояс? (задан config.time_zone)

3. ДА. Как я могу вызвать метод в консоли rails, чтобы протестировать его?

4. может быть Merchant.first.open?

5. Я получаю следующую ошибку NoMethodError: неопределенный метод `открыть?’ для #<Продавец: 0x000000039d2f80>