为什么我不能在ROR中的函数的活动记录中使用AND条件

时间:2015-03-01 11:53:55

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

MyBox.where(isClocked?: true) worked

MyBox.where(:OpenTime => beginMonth..endMonth ) worked

MyBox.where(isClocked?: true AND :OpenTime => beginMonth..endMonth ) not working

为什么我不能在第3句中使用AND

2 个答案:

答案 0 :(得分:3)

因为语法是错误的。以下将起作用:

MyBox.where(isClocked?: true, OpenTime: beginMonth..endMonth )
# Or
MyBox.where("isClocked? = ? AND OpenTime IN (?)", true, [*beginMonth..endMonth]  )

检查#where方法定义良好的Rails API,了解可以使用它的方法。

答案 1 :(得分:0)

因为where方法只是一个普通的Ruby方法,并且它不能发明新的语法。在Ruby中,在两个哈希之间使用and会使毫无意义,这实际上就是你想要做的事情:

{ key1: value1 } AND { key2: value2 } # syntax error

这在语法上是无效的,即使你使用实际的Ruby关键字and而不是常量AND,它的仍然语法上无效的Ruby:

{ key1: value1 } and { key2: value2 } # syntax error

您需要了解ActiveRecord的where接口在其可以接受的Ruby可以支持的语法中受到限制。默认情况下,如果要提供两个条件,则只需传递两对键和值,因为ActiveRecord始终假设您希望条件由AND s加入:

# ... where isClocked = true AND openTime > beginMonth AND openTime < endMonth
MyBox.where({isClocked?: true, OpenTime: beginMonth..endMonth})

您还可以附加多个.where来电,并且每组条件都会作为AND附加到查询中:

MyBox.where({isClocked?: true).where(OpenTime: beginMonth..endMonth})
因此,对于AND条件,

ActiveRecord不需要特殊语法。但是,如果需要OR条件,则需要手动编写SQL的小片段。