找到关联破坏的所有对象

时间:2010-11-03 23:01:31

标签: ruby-on-rails activerecord

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

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

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

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

2 个答案:

答案 0 :(得分:7)

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

Item.where('NOT EXISTS (SELECT * FROM categories where category.id = item.category_id)')

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

答案 1 :(得分:1)

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

uncategorized_items = Item.find_by_sql("select * from items where category_id IS NULL")

另一种方式是命名范围:

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

  # or...

  named_scope :uncategorized, :conditions => 'category_id IS NULL'
end

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

您可以使用find_by_sql和左外连接来查找一个表中的所有项,但不能查找另一个表中的所有项。在这里,我使用了一个downloads表和一个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