使用单个查询从has_many Rails关联中删除记录

时间:2017-10-23 20:36:12

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

我无法在Rails中从has_many关联中删除记录而不会触发不必要的查询。基本上,我有一个模型,它有一个has_many关系,我想根据一些标准从中删除多个记录。我希望能够同时保持关联最新,但也从数据库中删除记录,只需要一个DELETE查询来执行此操作。我已经尝试分配与新对象的关系(生成不必要的UPDATE查询)并调用delete_all(它生成一个查询但不更新关联)。

1 个答案:

答案 0 :(得分:1)

有两种方法可以从关系中删除记录。 lat = re.findall(r'lat: (\d+.\d+),', response.text) lng = re.findall(r'lng: (\d+.\d+),', response.text) print lat, lng 一次删除所有相关记录,在每个已删除记录上运行回调。 destroy删除一个查询中的所有记录,但不运行回调。

所以,在模型中你可以:

delete_all

当您删除客户时

class Customer < ApplicationRecord
  has_many :statements, dependent: :delete_all

所有这些都是在一个swell foop中完成的,没有对已删除的回调。

或 -

pry(main) foo = Customer.first
pry(main)> foo.destroy
  (0.3ms)  BEGIN
  SQL (290.4ms)  DELETE FROM `statements` WHERE `statements`.`customer_id` = 3
  SQL (2.6ms)  DELETE FROM `customers` WHERE `customers`.`id` = 3

当您删除客户时

class Customer < ApplicationRecord
  has_many :statements, dependent: :destroy

每个从属记录一次删除一个,每次删除都会运行回调。

pry(main) foo = Customer.first pry(main)> foo.destroy (0.4ms) BEGIN Statement Load (25.0ms) SELECT `statements`.* FROM `statements` WHERE `statements`.`customer_id` = 4 SQL (0.5ms) DELETE FROM `statements` WHERE `statements`.`id` = 9023 SQL (0.3ms) DELETE FROM `statements` WHERE `statements`.`id` = 9024 SQL (0.3ms) DELETE FROM `statements` WHERE `statements`.`id` = 9025 . . . etc etc etc . . . delete_all可以在具有类似效果的任何结果集上运行。因此,如果您想对相关记录进行一些过滤:

destroy

或 -

pry(main) foo = Customer.first
pry(main)> bar = foo.statements.where(some_param: 42)
pry(main)> bar.delete_all
  SQL (4.2ms)  DELETE FROM `statements` WHERE `statements`.`customer_id` = 7 AND `notices`.`some_param` = 42
=> 2