gpt4 book ai didi

ruby-on-rails - 为什么不#is_a?使用 ActiveRecord::NamedScope::Scope 的实例

转载 作者:行者123 更新时间:2023-12-04 06:10:36 24 4
gpt4 key购买 nike

我正在使用 Rails 2.3.9。为了说明这个问题,假设我们在模型上有一个命名范围:

class Book < ActiveRecord::Base
named_scope :has_isbn, :conditions => 'isbn IS NOT NULL'
end

如果你得到了命名范围的类, ActiveRecord::NamedScope::Scope返回:
Book.has_isbn.class
# => ActiveRecord::NamedScope::Scope

但是,如果您使用 #is_a?===判断它是否是一个作用域,它返回 false :
Book.has_isbn.is_a?(ActiveRecord::NamedScope::Scope)
# => false
ActiveRecord::NamedScope::Scope === Book.has_isbn
# => false

有谁知道为什么会这样?调用命名范围会返回 ActiveRecord::NamedScope::Scope 的实例(如果您查看 Rails 代码中的 lib/active_record/named_scope.rb,您可以看到它调用 Scope.new 并返回它),那么 #is_a? 为什么不呢?和 ===返回 true ?

最佳答案

查看 this code来自 Scope类(class):

NON_DELEGATE_METHODS = %w(nil? send object_id class extend find size count sum average maximum minimum paginate first last empty? any? respond_to?).to_set
[].methods.each do |m|
unless m =~ /^__/ || NON_DELEGATE_METHODS.include?(m.to_s)
delegate m, :to => :proxy_found
end
end
[].methods 中的每个方法——也就是说,数组响应的每个方法——都在 Scope 中定义。要传递给 the proxy object 的实例, NON_DELEGATE_METHODS 中定义的方法除外大批。这些都没有改变,请注意 class列在那里。

所以,当您调用 scope.class , 你得到 Scope作为回应。但是当你调用 scope.is_a? ,您实际上是在调用 scope.proxy_found.is_a? , 在这种情况下代理对象是 Array .
>> scope.is_a?(Array)
=> true

关于ruby-on-rails - 为什么不#is_a?使用 ActiveRecord::NamedScope::Scope 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7828666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com