所以这是一个简单的问题。我正在使用带有巨大遗留数据库的Rails,并且它有许多需要被视为nils的破坏的外键。
所以当我这样做时:Foo.find(:all,:conditions => {...},:include =>:bar)
使用SELECT * FROM栏连接所有栏的Rails WHERE ID IN(...)。到目前为止这么好,只有两个SQL查询。
现在的问题是,对于破解的fks,当我稍后尝试执行foo.bar时,Rails尝试使用SELECT * FROM bars WHERE id = broken_id来重新获取bar。然后它返回nil(对我来说正确),但所有那些SELECT id =结果是一个主要的性能问题,因为它用太多的SQL查询轰炸mysql。
检查foo.bar是否已经设置,以及是否只是强制它为零,这是一种简单的方法吗?
答案 0 :(得分:1)
您可以使用loaded?
方法测试关联是否已加载:
foo.bar.loaded?
如果您知道自己曾使用过:include
而foo.bar.loaded?
返回false
这一事实,那么您可以查看已故的fkey,跳过此foo.bar
。