找到关联破坏的所有对象

KJF*_*KJF 7 activerecord ruby-on-rails

我的rails应用程序中有两个模型,有很多并且属于关联.类别有很多项目,项目属于类别.

这些模型通过Item模型中的category_id列以正常方式关联.

我正在寻找一种快速查找数据库中所有元素的方法.即查找所有没有关联项目的类别和没有关联类别的项目.

例如,如果我有一个category_id为7的项目,但是已删除了具有id 7的类别,那么这将被视为已损坏.

Mag*_*gne 7

对于您的示例,要查找具有category_id的项目,以查找不再存在的类别:

Item.where('NOT EXISTS (SELECT * FROM categories where category.id = item.category_id)')
Run Code Online (Sandbox Code Playgroud)

您可能也想看一下这个:一个rake任务来跟踪丢失的数据库索引(虽然不是外键,但索引):https://github.com/eladmeidar/rails_indexes


Ste*_*oss 1

一个非常有效的方法是使用find_by_sql让数据库来完成繁重的工作:

uncategorized_items = Item.find_by_sql("select * from items where category_id IS NULL")
Run Code Online (Sandbox Code Playgroud)

另一种方法是命名范围:

class Item < ActiveRecord::Base
  scope :uncategorized, where(:category_id => nil) # rails 3

  # or...

  named_scope :uncategorized, :conditions => 'category_id IS NULL'
end
Run Code Online (Sandbox Code Playgroud)

这些只是一些想法。我想一旦你发现了这些破碎的关联,你就会计划修复它们,对吧?validates_associated如果这种情况不再发生对您来说很重要,您可能想在这两种模型中使用。

您可以使用 find_by_sql 和左外连接来查找一个表中的所有项目,但不能查找另一个表中的所有项目。在这里,我使用了一个下载表和一个 image_files 表(我只包含了 SQL):

SELECT d.*, d.image_file_id
from downloads as d
LEFT OUTER JOIN image_files as i 
ON i.id = d.image_file_id 
WHERE d.image_file_id IS NULL
Run Code Online (Sandbox Code Playgroud)