我的Rails / Heroku / Postgres应用中有Item
模型作为文档,包含一些文本,removed
标记和许多名为{{1}的子模型}第
我的Version
个对象的生产数据库中有数百万行,其中父Version
已将Item
标记设置为是,并且我想要从数据库中删除这些版本(并将removed
对象保留在原来的位置。)
我很难选择父项item
标志设置为true的所有版本。这是removed
中的代码:
version.rb
产生这个:
Version.all(:joins => :item, :limit => 20, conditions: { :items => { :removed => true } } ).each do |v|
v.delete
end
当我在本地运行时,它只删除版本对象,但是当我在Heroku Postgres中将第一个SQL语句作为dataclip运行时,它也会选择项目对象。我知道内部联接意味着从两个表中选择,但我不太了解这里发生了什么。我需要保持SELECT "versions".* FROM "versions" INNER JOIN "items" ON "items"."id" = "versions"."item_id" WHERE "items"."removed" = 't' LIMIT 20
DELETE FROM "versions" WHERE "versions"."id" = 1
... lots of DELETE FROM "versions"
个对象不变。任何帮助将不胜感激!
答案 0 :(得分:1)
它可能只是一种风格的东西,但我会编写这样的查询:
Version.joins(:item).where(items: { removed: true })
这个Rails和它生成的sql都不应该返回任何Item
个。我想它是引入古怪的数据手柄。我会尝试在本地下拉数据库并在Rails控制台中本地运行它。
此外,一旦你确定它只返回你想要的东西,你可以通过这样做来加快这个过程:Version.joins(:item).where(items: { removed: true }).destroy_all
这将回避Rails(并避免触发任何回调),只需在同一个sql查询中执行find和destroy。