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