#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>