【发布时间】:2012-07-29 17:36:19
【问题描述】:
目前在保存时,我正在尝试检查记录是否属于特定的“范围”。这个“范围”实际上只是 .where 调用的一些保存参数。同样在这个“范围”中,我只检查对象的值,而不检查它与数据库中其他对象的关系,因此如果有意义的话,查询数据库总是会过度杀戮。
我只能想出以下解决方案
begin
result = self.class.where(scope).find(self.id)
rescue
result = false
end
这样做的问题是,即使我已经有了记录,我也必须查询数据库,而且我不仅要在保存之前运行它,还要在保存之后运行它以检查它的值和保存后的值,因为如果尚未保存,则无法在数据库中查询更新版本。
可能有很多这样的检查,所以我想避免必须做两次,也不必多次查询数据库,即使最终我只是通过 id 查找。
我能想到的唯一其他解决方案是拥有一种方法,该方法可以将 where 调用转换为在传递对象时返回布尔值的 proc。唯一的问题是翻译它必须如何与正在使用的活动记录适配器一起工作,这似乎是一个完整的项目。那么有没有人知道有什么方法可以做到这一点,或者有什么宝石会有所帮助?
PS 我从缓存中获取了“范围”,因此我无法将其保存为 proc,因为您无法使用 Rails 将 proc 放入缓存中。
【问题讨论】:
-
提供您正在保存的记录的具体示例、示波器的条件是什么样的以及您尝试这样做的原因可能会有所帮助。可能有更好的方法来处理您正在尝试做的任何事情。
-
记录可以是任何东西,范围也可以是任何东西,只要它不需要与数据库中的其他任何东西进行比较,无论设置如何,它都应该是可重用的。它虽然是一个缓存系统。所以基本上,如果保存之前或之后的记录落入缓存的“范围”,那么缓存就会被删除。它适用于您想要缓存但不想过期的非常复杂的页面,除非更新的记录可能是缓存的一部分。
标签: ruby-on-rails activerecord