我的rails应用程序中有两个模型,一个有很多,一个属于关联。类别有多个项目,项目属于类别。
这些模型通常通过项目模型中的category_id列进行关联。
我正在寻找一种快速的方法来查找数据库中所有关联断开的元素。即查找不存在关联项目的所有类别和不存在关联类别的项目。
例如,如果我有一个category_id为7的项目,但id为7的类别已被删除,那么这将被认为是损坏的。
发布于 2015-01-21 23:48:13
在您的示例中,为不再存在的类别查找带有category_id的项:
Item.where('NOT EXISTS (SELECT * FROM categories where category.id = item.category_id)')您可能还想看看这个:一个用来跟踪丢失的数据库索引(不是外键,而是索引)的rake任务:https://github.com/eladmeidar/rails_indexes
发布于 2010-11-04 07:14:43
一种非常有效的方法是使用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表和一个SQL表(我只包含了image_files ):
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 NULLhttps://stackoverflow.com/questions/4092426
复制相似问题