Проверка даты и времени Ruby в базе данных

#ruby-on-rails #ruby #forms

#ruby-on-rails #ruby #формы

Вопрос:

Я новичок в Ruby. У меня есть форма, которая создает новую встречу (я сохраняю там doctor_id , patient_id , date , time ), У меня также есть расписания в базе данных ( doctor_id в расписании есть FK , есть dayofweek , starttime , endtime ), и теперь я хочу проверить, доступен ли врач в выбранный день и время, и если нет назначений с этой датой и временем. Если я не могу добавить и сообщение об ошибке.

Переведите для лучшего понимания:

 -dzien_tygodnia - day_of_the_week;
-data_wizyty - visit_date;
-godzina_wizyty - visit_time;
-poczatek_pracy - start_working;
-koniec_pracy - end_working.
  

Мой _form.html.erb :

     <%= form_for(@appointment) do |f| %>
  <% if @appointment.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@appointment.errors.count, "error") %> prohibited this appointment from being saved:</h2>

      <ul>
      <% @appointment.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :data_wizyty %><br />
  <%=
    options = { start_year: 2.year.from_now.year,
                end_year: 2013,
                include_blank: true,
                default: nil }
    f.date_select :data_wizyty, options
  %>
  <!--<input type="text" data-behaviour='datepicker' :data_wizyty > -->
  </div>
  <div class="field">
    <%= f.label :godzina_wizyty %><br />
    <%= f.time_select :godzina_wizyty %>
  </div>
  <div class="field">
    <%= f.hidden_field :doctor_id, :value => Doctor.find(session[:current_doctor_id2]).id %>
  </div>
  <div class="field">
    <%= f.hidden_field :patient_id, :value => Patient.find(session[:current_patient_id]).id %>
  </div>
  <div class="actions">
    <%= submit_tag "Utworz wizyte" %>
  </div>
<% end %>
  

appointment.rb :

 class Appointment < ActiveRecord::Base
  validates :doctor_id, uniqueness: { scope: [:data_wizyty, :godzina_wizyty], message: 'Ten termin jest juz zajety!' }
  validate :doctor_is_scheduled

  attr_accessible :data_wizyty, :doctor_id, :godzina_wizyty, :notatka, :objawy_choroby, :patient_id



    belongs_to :patient
    belongs_to :doctor
    belongs_to :schedule
    belongs_to :refferal

    has_many :employees

  def doctor_is_scheduled
    if Schedule.where(doctor: doctor, dzien_tygodnia: data_wizyty.wday)
               .where('poczatek_pracy < ? and koniec_pracy > ?', godzina_wizyty, godzina_wizyty).empty?
      self.errors.add(:doctor, message: 'nie pracuje w tym terminie!')
    end
  end


end
  

Не могли бы вы сказать мне, какие файлы должны быть включены?

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

1. При проверке отсутствия записи на прием в эту дату и время, будет ли это встреча с текущим врачом или встреча с любым врачом?

2. Т.е. могут ли несколько врачей записаться на прием одновременно?

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

4. Хорошо, отлично. В этом случае я считаю, что мое решение должно сработать для вас.

5. Но я действительно, действительно новичок в этом, и я думаю, что это будет слишком сложно для меня:(

Ответ №1:

То, что вы ищете здесь, — это проверки. Прочтите это руководство по Rails, потому что это будет невероятно полезно для вас. Что касается вашего вопроса, вы должны иметь возможность использовать следующее:

 class Appointment < ActiveRecord::Base
  validates :doctor_id, uniqueness: { scope: [:date, :time], 'already has an appointment at that time' }
  validate :doctor_is_scheduled

  def doctor_is_scheduled
    if Schedule.where(doctor: doctor, dayofweek: date.wday)
               .where('starttime < ? and endtime > ?', time, time).empty?
      self.errors.add(:doctor, 'is not scheduled to be working at that time')
    end
  end
end
  

Первая строка ( validates :doctor_id, uniqueness: ) проверяет, что на заданную дату и время врач уникален, т. Е. Врач не будет забронирован дважды. doctor_is_scheduled Метод проверяет, чтобы для данного врача и дня недели у врача была запланирована смена (между starttime и endtime ).