Ruby on rails 为什么ActiveRecord';s删除所有在内部事务时触发的单个查询?
我有这个方法:Ruby on rails 为什么ActiveRecord';s删除所有在内部事务时触发的单个查询?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有这个方法: # app/models/calendar.rb has_many :events def update_and_recreate_events ActiveRecord::Base.transaction do self.events.delete_all update(params) Event.import!(build_events) end end 为了确保只有在新记录有效时才删除记录,反之亦然,我将这三种方法放在事务中 delete
# app/models/calendar.rb
has_many :events
def update_and_recreate_events
ActiveRecord::Base.transaction do
self.events.delete_all
update(params)
Event.import!(build_events)
end
end
为了确保只有在新记录有效时才删除记录,反之亦然,我将这三种方法放在事务中
delete\u all
应通过一次查询删除表中的所有记录。但是,由于我在事务中使用了delete\u all
,因此它会对每个记录触发一个delete查询。对于事件中的每个事件,日志都会显示类似的内容:
SQL (0.5ms) DELETE FROM "events" WHERE "events"."id" = $1 [["id", 73391]]
我不知道它为什么会这样,也许我遇到了一些基本的错误
编辑
为避免误解,请考虑:
我不想删除表中的所有记录,但要删除与当前对象关联的所有记录。因此:self.events.delete\u all
作为缔约国:
这是一条直接进入数据库的SQL DELETE语句,比销毁所有语句效率高很多
为什么它在我的例子中不起作用呢?因为ActiveRecord使用了DELETE FROM
的DELETE\u all
和destroy\u all
方法,而这正是这个操作符的工作方式
要通过一个查询删除所有表记录,SQL应该使用。Rails示例如下所示:
Model.connection_pool.with_connection { |c| c.truncate(Model.table_name) }
你需要写作
Event.delete_all
这将生成一行查询
DELETE FROM "event";
我不知道你们为什么叫self,因为它指的是Klass类的主要对象
请再解释一下
更新并尝试回答
据我所知,你需要补充
has_many :events, dependent: :delete__all
我想你对这个问题有点误解了。OP不尝试从表中删除所有记录,而是删除所有匹配的记录。他们希望通过引用所有要删除事件的单个delete from
语句来完成,而不是通过每个事件的多个delete from
调用来完成。@Shadwell我引用:“delete\u all
应该通过一个查询删除表中的所有记录。”。但是delete from
不是这样工作的。谢谢你的否决票。好吧,没关系,我只是想帮你解释为什么你会被否决。直到现在我才投了反对票。