我在我的rails应用程序中有两个模型,有很多并且属于关联。 类别有很多项目,项目属于类别。
这些模型通过Item模型中的category_id列以正常方式关联。
我正在寻找一种快速查找数据库中所有元素的方法。 即查找所有没有关联项目的类别和没有关联类别的项目。
例如,如果我有一个category_id为7的项目,但是已删除了ID为7的类别,那么这将被视为已损坏。
答案 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