检查特定的活动记录对象是否在特定的"范围"中

rov*_*ver 8 activerecord ruby-on-rails

目前正在保存中我试图查看录制的内容是否属于特定的"范围".这个"范围"实际上只是.where调用的一些保存参数.此外,对于这个"范围",我只检查对象的值,而不是它与数据库中其他对象的关系,因此如果有意义的话,查询数据库将永远被过度杀死.

我只能提出以下解决方案

begin
   result = self.class.where(scope).find(self.id)
rescue
  result = false
end
Run Code Online (Sandbox Code Playgroud)

这个问题是我必须查询数据库,即使我已经有了记录,我不仅要在保存之前运行它,而是在保存后检查它的值以及保存后的值,因为那里如果尚未保存更新版本,则无法查询数据库.

可以有很多这样的检查,所以我想避免不得不两次,并且还要多次查询数据库,即使最终我只是通过id查找内容.

我能够想到的唯一其他解决方案是有一个方法,一些如何将where调用转换为proc,在传递一个对象时返回一个布尔值.唯一的问题是翻译它将如何使用正在使用的活动记录适配器,这似乎是一个完整的项目.那么有谁知道这样做的一些方法,或者有助于它的宝石?

PS我从缓存中获取"范围",因此我无法将其保存为proc,因为您无法使用Rails将procs放入缓存中.

ari*_*uod 6

首先,你可以改善你的第一个解决方案

result = self.class.where(scope).exists?(self.id)
Run Code Online (Sandbox Code Playgroud)

如果您不想检查数据库,为什么不检查对象的属性是否具有范围的值?如果您的范围是

class.where(:attr1 => value1, :attr2 => value2, :attr3 => value3)
Run Code Online (Sandbox Code Playgroud)

那么你可以做到

result = self.attr1 == value1 and self.attr2 == value2 and self.attr3 == value3
Run Code Online (Sandbox Code Playgroud)