Ruby on Rails (консоль): Collection.where() возвращает ArgumentError с несколькими условиями
У меня есть база данных, в которой я пытаюсь найти данные в определенном диапазоне и соответствовать определенным критериям. Я использую следующую команду:
GameSlot.where("s = ? and st >= :start_date and et <= :end_date", 5, {start_date: '2016-01-01', end_date: '2017-01-01'})
Когда я выполню, я вернусь:
ArgumentError: неверное количество аргументов (3 для 0..1)
Я новичок в Ruby on Rails, поэтому любая помощь приветствуется.
РЕДАКТИРОВАТЬ: типы данных для "s" является целым числом, "st" и "et" время, но меня интересует только дата.
3 ответа
Должно быть больше так, я думаю:
GameSlot.where(["s = :s and st >= :start_date and et <= :end_date",
s: 5,
start_date: '2016-01-01',
end_date: '2017-01-01'])
Обратите внимание, что where
здесь только один аргумент, массив.
Документация по QueryMethods# где.
Я думаю, вы ищете что-то вроде этого:
GameSlot.where("s = ? and st >= ? and et <= ?", 5, '2016-01-01', '2017-01-01')
В качестве альтернативного подхода вы могли бы рассмотреть методы класса (или области видимости, если вам нравятся такие вещи). Что-то вроде:
class GameSlot < ActiveRecord::Base
class << self
def s(val) where(s: val) end
def starting_on_or_after(date) where('st >= ?', date) end
def ending_on_or_before(date) where('et <= ?', date) end
end
end
Тогда вы можете сделать что-то вроде:
GameSlot.s(5).starting_on_or_after('2016-01-01').ending_on_or_before('2017-01-01')
Таким образом, вы оставляете логику запроса внутри GameSlot
модель, которая кажется немного лучше инкапсулированной (для меня).
Что-то, что можно пережевать.