ruby-on-rails - 建立ActiveRecord关系而不让它执行查询

标签 ruby-on-rails activerecord

我试图建立一个查询,如下所示:

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(在Rails 3中)或articles.to_a(在Rails 4中)执行查询。

当然,如果您随后将此代码移至rake任务或模型或其他内容,则可以删除这些; nil位,因为它们看起来有些混乱,在那时将是无用的。

控制台的另一问题可能是它会看到.where() {NEWLINE}并在那一点执行查询,我倾向于将点放在上一行以消除命令结尾的任何歧义:

rel = article.where(version: 'some_version').
             joins(:categories).
             merge(Category.where(:uuid => 'some_cat_uuid')); nil

关于ruby-on-rails - 建立ActiveRecord关系而不让它执行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437470/

相关文章:

php - 在 CodeIgniter 的 Active Record 中使用 'having'

ruby-on-rails - 两列的 active_admin config.sort

ruby-on-rails - 为什么在 Ruby 中有时需要括号?

sql - rails 嵌套 has_many 与外部范围连接未命中连接表 : sql error

javascript - 从内部链接进入页面时,Bootstrap 模式未打开

ruby-on-rails-3 - 导轨 : ActiveRecord Query for has_many :through model

ruby-on-rails - 无方法错误 : undefined method `pluck' for #<Model>

ruby-on-rails - Rails,如何为模型中的关系别名?

ruby-on-rails - 将对象数组转换为 ActiveRecord::Relation

ruby-on-rails - Rails 5 - 为 "Comments"创建 "Article",它们之间有 has_many 关系