按父属性选择ActiveRecord对象

时间:2014-12-10 04:59:42

标签: ruby-on-rails postgresql activerecord heroku

我的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" 个对象不变。任何帮助将不胜感激!

1 个答案:

答案 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。