我正在尝试构建如下查询:
rel = article.where(version: 'some_version')
.joins(:categories)
.merge(Category.where(:uuid => 'some_cat_uuid'))
articles = rel.where(published: true).limit(10)
# etc.
问题是无论我做什么,第一个查询似乎都会执行。难道我做错了什么?
我正在尝试构建如下查询:
rel = article.where(version: 'some_version')
.joins(:categories)
.merge(Category.where(:uuid => 'some_cat_uuid'))
articles = rel.where(published: true).limit(10)
# etc.
问题是无论我做什么,第一个查询似乎都会执行。难道我做错了什么?
.inspect
当您在控制台中运行命令时,它会自动在末尾添加类似的内容以显示命令的结果。例如(这是我现在正在开发的应用程序):
irb(main):061:0> Job.where(id: 251000)
Job Load (3.8ms) SELECT "jobs".* FROM "jobs" WHERE "jobs"."deleted_at" IS NULL AND "jobs"."id" = 251000
=> [#<Job id: 251000, {...}>]
因此,您的第一行代码很好,通常不会执行查询,但由于您在控制台中运行它,它会立即执行,以便它可以为您显示结果。
解决这个问题的一种方法是添加; nil
到命令的末尾,这样控制台就不会尝试显示结果(它只会显示 nil 作为该行的结果。IE:
irb(main):062:0> Job.where(id: 251000); nil
=> nil
这样做你应该能够做你所期望的(延迟执行查询,直到你真正需要结果):
rel = article.where(version: 'some_version')
.joins(:categories)
.merge(Category.where(:uuid => 'some_cat_uuid')); nil
articles = rel.where(published: true).limit(10); nil
然后您可以使用articles.all
(in Rails 3) 或articles.to_a
(in Rails 4)执行查询
当然,如果您随后将此代码移至 rake 任务或模型或其他东西,您可以丢弃这些; nil
位,因为它们看起来有点杂乱并且在那时毫无用处。
控制台的另一个争论点可能是它会看到.where() {NEWLINE}
并执行查询,我倾向于将点放在前一行以消除我的命令结束位置的任何歧义:
rel = article.where(version: 'some_version').
joins(:categories).
merge(Category.where(:uuid => 'some_cat_uuid')); nil