在rails控制台中,我这样做:
input = Input.create :name => "foo"
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">
Input.all
=> [#<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">]
input
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">
input.destroy
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">
> Input.all
=> []
> input
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">
> input.reload
ActiveRecord::RecordNotFound: Couldn't find Input with id=8
> input
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">
我真正希望看到的是:
> input
=> nil
该对象已从数据库中删除,但该变量仍然存在,并且仍在尝试指向它。发生了什么事?
答案 0 :(得分:3)
input
变量在内存中存储对实例的引用。销毁记录将从数据库中删除该行。调用input.reload
(docs)会在尝试查找记录时引发异常,但不会代表您将变量的值设置为nil
。
此行为在DELETE请求的范围内非常有用,在该请求中,您希望显示有关所删除对象的信息。例如:
class WidgetsController < ApplicationController
def destroy
@widget = Widget.find(params[:id])
@widget.destroy
respond_with @widget, notice: "You successfully removed #{@widget.name}"
end
end
答案 1 :(得分:1)
destroy方法对数据库进行SQL调用,并销毁包含它的表中的行。它仍然允许你操作应用程序中的对象,只要它仍在范围内(即)回调和 即使在销毁对象后也允许使用过滤器。
如果我们不希望触发回调或者我们想要更好的性能,最好使用“删除”
您可以使用input.delete