Ruby on Rails(控制台):Collection.where()返回具有多个条件的ArgumentError

时间:2017-06-27 17:06:26

标签: ruby-on-rails ruby rails-console

我有一个数据库,我试图在一定范围内找到数据并满足某些标准。我使用以下命令:

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的新手,所以感谢任何帮助。

编辑:&#34; s&#34;的数据类型是整数,&#34; st&#34;和&#34; et&#34;是时候了,但我只对约会感兴趣。

3 个答案:

答案 0 :(得分: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#where上的文档。

答案 1 :(得分:2)

我猜你正在寻找这样的东西:

GameSlot.where("s = ? and st >= ? and et <= ?", 5, '2016-01-01', '2017-01-01')

答案 2 :(得分:1)

作为替代方法,您可以考虑类方法(或范围,如果您喜欢这种事情)。类似的东西:

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模型中,这对我来说似乎有点好了。

要咀嚼的东西。