Ada*_*amT 2 database activerecord ruby-on-rails heroku
我似乎无法从heroku上的应用程序中删除旧记录.
目前,heroku调度程序运行:
class Post < ActiveRecord::Base
def self.get_data
# this populates my app but the database is starting to get large and I don't need the old records
scr = Scrape.new
data_array = scr.scrape
store_data(data_array)
# destroy_old_data
end
Run Code Online (Sandbox Code Playgroud)
但我想取消注释"destory_old_data"电话.
def destroy_old_data
# oldest = Post.where("updated_at > ?", 30.days.ago)
# Post.delete_all("updated_at > ?", 30.days.ago)
# Post.destroy_all("updated_at > ?", 30.days.ago)
oldest = Post.find(:all, "updated_at > ?", 30.days.ago)
oldest.destroy
end
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我已经尝试了一些似乎在控制台本地工作但我无法让它们在heroku上工作的东西.
我得到的错误是:
ArgumentError: wrong number of arguments (2 for 1)
or
when using Post.find
NoMethodError: undefined method `destroy' for #<Array:0x00000004579898>
Run Code Online (Sandbox Code Playgroud)
我能够成功找到并删除所有这些旧记录的最简单的电话是什么?
任何援助将不胜感激.
要解决NoMethodError,您需要遍历记录数组并调用destroy每个记录.
oldest.each { |r| r.destroy }
Run Code Online (Sandbox Code Playgroud)
或者你可以使用像destroy_all你甚至不需要额外的方法find.http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
Post.destroy_all(['updated_at < ?', 30.days.ago])
Run Code Online (Sandbox Code Playgroud)
将条件放在数组中应该将ArgumentError解析为他的答案中提到的@luke-chadwick.
要考虑的一个项目是您要删除的记录数量(这里是文档中的注释):
注意:当您一次删除多个记录时,实例化,回调执行和删除每条记录可能非常耗时.它为每条记录生成至少一个SQL DELETE查询(或者更多,以强制执行您的回调).如果要快速删除多行,而不关心其关联或回调,请改用delete_all.
delete_all 对你来说可能是一个更快的选择,除非你需要清理其他相关记录,比如评论.