MyBox.where(isClocked?: true) worked
MyBox.where(:OpenTime => beginMonth..endMonth ) worked
MyBox.where(isClocked?: true AND :OpenTime => beginMonth..endMonth ) not working
为什么我不能在第3句中使用AND
?
答案 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的小片段。