Ruby on rails 在Rails中查找缺少关联记录的记录

Ruby on rails 在Rails中查找缺少关联记录的记录,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有一个遗留数据库,其中有两个模型: class Purchase belongs_to :product end class Product has_many :purchases end 现在,随着时间的推移,一些产品被删除,即使相关的购买仍存在于数据库中。有什么方法可以从rails控制台中获取所有相关产品已被删除的采购的列表吗 Mypurchase表引用了product,并且有一列product\u id为什么不在删除产品时取消购买 class Product has_ma

我有一个遗留数据库,其中有两个模型:

class Purchase
  belongs_to :product
end

class Product
  has_many :purchases
end
现在,随着时间的推移,一些
产品
被删除,即使相关的
购买
仍存在于数据库中。有什么方法可以从rails控制台中获取所有相关
产品已被删除的
采购
的列表吗


My
purchase
表引用了
product
,并且有一列
product\u id

为什么不在删除产品时取消购买

class Product
  has_many :purchases, :dependent => :nullify
end
这样,您所要做的就是查询product_id为null的采购。希望这有帮助

编辑: 如果您现在正在使用此方法,为了更新旧记录并使其保持一致,您应该执行以下操作:

Purchase.where.not(product_id: Product.select(:id).distinct).update_all(product_id: nil)

所以像这样,它现在应该可以工作了

为什么不在删除产品时取消购买

class Product
  has_many :purchases, :dependent => :nullify
end
Purchase.left_outer_joins(:product).where(products: {id: nil})
这样,您所要做的就是查询product_id为null的采购。希望这有帮助

编辑: 如果您现在正在使用此方法,为了更新旧记录并使其保持一致,您应该执行以下操作:

Purchase.where.not(product_id: Product.select(:id).distinct).update_all(product_id: nil)
所以像这样,它现在应该可以工作了

Purchase.left_outer_joins(:product).where(products: {id: nil})
注意:导轨5有

所以在这里,基本上它将导致所有没有关联产品的购买

注意:导轨5有


因此,这里基本上会导致所有没有关联产品的购买。

我现在这样做了,但我仍然有缺少关联的旧记录。@RonanLopes对于您的种类信息映射在内部进行循环,这是没有效率的。不过,这也可以在sql查询中完成。@Gabbar是的,我知道。。。但是,由于这是一件只能执行一次的事情,我认为这不是一个问题…@Gabbar有没有一种更快捷的方法可以在不使用地图的情况下获取该案例的ID数组列表?@RonanLopes当然!你可以使用
pulk
Product.pulk(:id)
,这将启动sql查询,而不是通过循环和sql查询可以完成的事情,我们为什么要通过循环呢?我现在就这么做了,但我仍然有丢失关联的旧记录。@RonanLopes为您的同类信息映射内部通过循环,这是无效的。不过,这也可以在sql查询中完成。@Gabbar是的,我知道。。。但是,由于这是一件只能执行一次的事情,我认为这不是一个问题…@Gabbar有没有一种更快捷的方法可以在不使用地图的情况下获取该案例的ID数组列表?@RonanLopes当然!你可以使用
pulk
Product.pulk(:id)
,这将启动sql查询,而不是通过循环和sql查询可以完成的事情,我们为什么要通过循环?
购买。Product\u id
不是
NULL
它只是不再引用现有产品可能你的意思是
产品:{id:nil}
@engineersmnky噢,对不起,我弄错了,谢谢你纠正我的错误!
购买。产品\u id
不是
NULL
它只是不再引用现有产品可能你的意思是
产品:{id:nil}
@engineersmnky噢,对不起,我弄错了,谢谢你纠正我!删除了,因为接受的答案是答案删除了,因为接受的答案是答案