Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 检查特定活动记录对象是否位于特定的';范围';_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 检查特定活动记录对象是否位于特定的';范围';

Ruby on rails 检查特定活动记录对象是否位于特定的';范围';,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,目前在保存中,我正在尝试检查记录是否属于特定的“范围”。这个“范围”实际上只是.where调用的一些保存的参数。同样,在这个“范围”中,我只检查对象的值,而不检查它与数据库中其他对象的关系,因此,如果有意义的话,查询数据库将永远是多余的 我只能想出下面的解决办法 begin result = self.class.where(scope).find(self.id) rescue result = false end 这样做的问题是,即使我已经有了记录,我也必须查询数据库,而且我不仅

目前在保存中,我正在尝试检查记录是否属于特定的“范围”。这个“范围”实际上只是.where调用的一些保存的参数。同样,在这个“范围”中,我只检查对象的值,而不检查它与数据库中其他对象的关系,因此,如果有意义的话,查询数据库将永远是多余的

我只能想出下面的解决办法

begin
   result = self.class.where(scope).find(self.id)
rescue
  result = false
end
这样做的问题是,即使我已经有了记录,我也必须查询数据库,而且我不仅要在保存之前运行,还要在保存之后运行,以检查保存后的值,因为如果没有保存更新版本,就无法查询数据库

可能有很多这样的检查,所以我希望避免做两次,也不必多次查询数据库,即使最终我只是通过id查找某些内容

我能想到的唯一其他解决方案是有一个方法,该方法可以将where调用转换为一个proc,在传递对象时返回布尔值。唯一的问题是如何翻译它,以及如何与正在使用的活动记录适配器一起工作,这似乎是一个完整的项目。那么,有人知道这样做的方法吗,或者知道一种有帮助的宝石吗


PS我从缓存中获取“范围”,因此我无法将其保存为进程,因为您无法使用Rails将进程放入缓存。

首先,您可以稍微改进您的第一个解决方案

result = self.class.where(scope).exists?(self.id)
如果不想检查数据库,为什么不检查对象的属性是否具有作用域的值?如果你的范围是

class.where(:attr1 => value1, :attr2 => value2, :attr3 => value3)
那你就可以了

result = self.attr1 == value1 and self.attr2 == value2 and self.attr3 == value3

如果您的作用域很简单,您可能希望避免代码重复。我的解决方案允许您调用
model.active?
以了解实例是否属于该范围,并调用
model.active
以查找与该范围匹配的所有记录<代码>模型.活动?不涉及任何数据库查询

考虑将其添加到
config/initializers/scope\u and\u method.rb

require 'active_record/named_scope'

module ActiveRecord::NamedScope::ClassMethods
  def scope_and_method field, *values
    field = field.to_sym
    values.each do |value|
      named_scope value.to_sym, :conditions => {field => value}
      define_method "#{value}?" do
        send(field.to_sym) == value
      end
    end
  end
end
用法:

scope_and_method :state, 'active', 'inactive'
就像是:

named_scope :active, :conditions => {:state => 'active'}
named_scope :inactive, :conditions => {:state => 'inactive'}

def active?
  state == 'active'
end

def inactive?
  state == 'inactive'
end

这是Rails 2.3的解决方案。这需要对Rails 3和4进行非常小的调整。(
named_scope
->
scope
)我将很快检查它。

提供一个具体的示例,说明您正在保存的记录、作用域的条件以及您尝试执行此操作的原因,可能会有所帮助。可能有更好的方法来处理您正试图做的任何事情。记录可以是任何东西,范围也可以是任何东西,只要它不需要与数据库中的任何其他东西进行比较,它应该是可重用的,无论设置如何。不过,对于缓存系统来说,这是一个问题。因此,基本上,如果保存之前或之后的记录属于缓存的“范围”,则缓存将被删除。它适用于你想要缓存的非常复杂的页面,但不想过期,除非更新的记录可能是缓存的一部分。这里的同一个问题:第一部分帮助很大,我不知道为什么我没有想到这一点,让我的头在里面走得很远!问题的第二部分是,我不想将where语句仅限于哈希火箭设置。例如,在我正在做的一个项目中,范围是如果条目是在两个日期之间发布的,那么我将不得不解析给出的内容。虽然这确实帮助我开始朝着正确的方向思考!谢谢