запрос активной записи к массиву даты и времени - PullRequest
0 голосов
/ 29 июля 2011

Учитывая, что у меня есть массив datetimes:

array = [Sat, 30 Jul 2011 00:00:00 CEST +02:00, Sat, 30 Jul 2011 00:15:00 CEST +02:00, Sat, 30 Jul 2011 00:30:00 CEST +02:00, Sat, 30 Jul 2011 00:45:00 CEST +02:00

Я хочу, чтобы мой метод класса модели возвратил даты, которые не соответствуют (не запланированы)

 Sat, 30 Jul 2011 00:00:00 CEST +02:00

#appointment.rb (with colum `date` as DateTime)

def self.booked(array)
  where("date NOT IN (?)", array)

end

Thx дляпосоветуйте!

Ответы [ 3 ]

1 голос
/ 29 июля 2011

Это потому, что ваш массив искажен:

array = [Sat, 30 Jul 2011 00:00:00 CEST +02:00, Sat, 30 Jul 2011 00:15:00 CEST +02:00, Sat, 30 Jul 2011 00:30:00 CEST +02:00, Sat, 30 Jul 2011 00:45:00 CEST +02:00

обратите внимание, что это разделяет дни как отдельные элементы. Или это ты делаешь? Если нет, вам, вероятно, следует преобразовать их все в фактические DateTime объекты (возможно, используя #parse), а затем поместить их в массив.

Кроме того, вы можете захотеть превратить этот метод в область видимости:

scope :booked, lambda { |datetimes| where("date NOT IN (?)", datetimes) }
1 голос
/ 29 июля 2011

Я предполагаю, что date на самом деле дата в базе данных, а не дата или время.Итак, вам нужно конвертировать ваши Ruby Datetimes в просто экземпляры Date:

def self.booked(array)
  where("date NOT IN (?)", array.map(&:to_date))
end

Если вы не конвертируете их в Dates вручную, AR не будет знать, что должно конвертировать их в даты длябаза данных;затем, в зависимости от базовой базы данных, вы можете получить пустые результаты или, возможно, ошибки.

1 голос
/ 29 июля 2011

Ваш код выглядит нормально для меня, но вам нужно предоставить массив, например:

where(['date NOT IN(?)', array])

Вот пример с классом вебинара со столбцом даты

>> array = Webinar.all[0..2].map(&:date)
=> [Wed, 04 May 2011 02:16:00 PDT -07:00, Tue, 05 Apr 2011 06:00:00 PDT -07:00, Thu, 30 Jun 2011 07:30:00 PDT -07:00]
>> count_without_array = (Webinar.count - array.size)
>> Webinar.where(['date NOT IN(?)', array]).count == count_without_array
=> true

Имейте в виду, что дата должна точно совпадать, если разница в 1 секунду не сработает.

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