【问题标题】:Rails 3.2.13: Stop ActiveRecord Lazy LoadingRails 3.2.13:停止 ActiveRecord 延迟加载
【发布时间】:2013-10-03 18:48:05
【问题描述】:

每当我运行 where 子句时,查询不会执行,直到我尝试从结果中访问实际数据。无论如何我可以让它自动执行。

例子:

delete_list = Rom::Leaderboard.where("pvp_type = ? AND server_id = ?", pvptype, server_id)

delete_list 现在包含一个 ActiveRecord 对象。但我希望它保存结果数组而不必运行类似

delete_list.each ...

【问题讨论】:

  • 你能试试delete_list.delete_all吗?
  • 是的,我稍后会这样做。但是在运行 delete_list.delete_all 之前我需要 delete_list 来保存实际数组是有原因的

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2


【解决方案1】:

要快速加载整个查询,您可以使用.all,例如:

delete_list = Rom::Leaderboard.where(...).all

这将导致delete_list 成为一个数组。

【讨论】:

  • 谢谢。出于某种原因,我发誓我试过这个,但没有说没有方法错误。谢谢!
  • 在 Rails 4 中,SomeModel.where(something: true).all弃用。请改用.to_a。更多信息:stackoverflow.com/a/18203898/1608670
【解决方案2】:

好吧,如果你只是想删除,调用destroy_alldelete_all 会立即运行

Rom::Leaderboard.where("pvp_type = ? AND server_id = ?", pvptype, server_id).destroy_all

delete_list = Rom::Leaderboard.where("pvp_type = ? AND server_id = ?", pvptype, server_id)
delete_list.destroy_all

至于destroy_alldelete_all的区别。

  • destroy_all: 关联对象通过调用其destroy 方法与该对象一起被销毁。这将有效地循环遍历每个对象,并在其上调用destroy。因此,每个对象至少有 1 个查询。
  • delete_all:所有关联的对象都会立即销毁,而不调用它们的 :destroy 方法。这基本上使用您的 where 子句创建了一个 delete from leader_boards 查询。因此,无论您有多少对象,它只运行 1 个查询。但是,不会清理任何关联的对象。

【讨论】:

    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多