Rails 3.2.13:停止ActiveRecord延迟加载

时间:2013-10-03 18:48:05

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

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

示例:

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

delete_list现在包含一个ActiveRecord对象。但我希望它能够保存结果数组,而不必像

那样运行
delete_list.each ...

2 个答案:

答案 0 :(得分:1)

要急切加载整个查询,您可以使用.all,如:

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

这将导致delete_list成为数组。

答案 1 :(得分:0)

好吧,如果您只是想删除,请立即调用destroy_alldelete_all

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

OR

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

至于destroy_alldelete_all之间的区别。

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