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
不是这样工作的。谢谢你的否决票。好吧,没关系,我只是想帮你解释为什么你会被否决。直到现在我才投了反对票。