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 модель, которая кажется немного лучше инкапсулированной (для меня).

Что-то, что можно пережевать.

Другие вопросы по тегам