这些Rails查询语法是否可互换?

时间:2016-02-28 02:51:33

标签: ruby-on-rails ruby activerecord

>scope :a, -> { joins(:b).where('bs.c': false) }

>scope :a, -> { joins(:b).where('bs.c = ?', false) }

只是想问这两行是否做同样的事情?第一个似乎在开发中工作正常但在我尝试推送到Heroku时给了我一个语法错误。第一个被弃用了吗?

2 个答案:

答案 0 :(得分:1)

我相信这些更易于互换,没有语法错误:

scope :a, -> { joins(:b).where(bs: { c: false }) }

scope :a, -> { joins(:b).where('bs.c' => false }) }

scope :a, -> { joins(:b).where('bs.c = ?', false) }

scope :a, -> { joins(:b).where('bs.c = :q', { q: false }) }

就个人而言,第一行是我的首选,因为您可以在该嵌套哈希中列出多个列,而无需继续重复表名/别名。

答案 1 :(得分:0)

只有Ruby 2.2及更高版本允许使用带引号键的JSON哈希语法,即

{'foo' : bar}

而不是

{foo: bar}

当然,在您的情况下,由于密钥中的.,未引用该密钥可能无法正常工作。

这表明你在本地和heroku上运行不同的Ruby版本。

除此之外,它们应该是等价的。