Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 ActiveRecord查询方法响应-需要取消限制_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails ActiveRecord查询方法响应-需要取消限制

Ruby on rails ActiveRecord查询方法响应-需要取消限制,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,简介:Rails 3.2;'a'是一个对象,也是一个ActiveRecord模型,它有许多消息(也是ActiveRecord模型)——尽管这对于我的问题可能不是很重要 所以问题是:为什么会这样 irb(main):046:0>a.messages.回复?(:where) =>正确 但是还有这个, irb(main):047:0>a.messages.methods.include?(:where) =>错误 ? 发生了什么事?显然这里有一些红宝石魔法,这使得这些探索物体的方法产生了不同的

简介:Rails 3.2;'a'是一个对象,也是一个ActiveRecord模型,它有许多消息(也是ActiveRecord模型)——尽管这对于我的问题可能不是很重要

所以问题是:为什么会这样

  • irb(main):046:0>a.messages.回复?(:where)
    =>正确
但是还有这个,

  • irb(main):047:0>a.messages.methods.include?(:where)
    =>错误
?


发生了什么事?显然这里有一些红宝石魔法,这使得这些探索物体的方法产生了不同的结果;我猜一个是查询数组类,另一个是查询。。。响应的事物:where(在其他方法中)。甚至不知道该怎么称呼它。我猜它是在用一些东西查询数组类的对象…'混在一起?(我想我听说Ruby上下文中经常使用这个术语…

这里的罪魁祸首很可能是
方法\u缺失

Ruby和Rails的许多“神奇”方面都归功于这个漂亮的小方法。基本上,作为抛出NoMethodError之前的最后努力,Ruby在其对象上调用了名为
method\u missing
的方法。这允许Rails(4.0之前)响应动态查找程序,如
find\u by\u name\u和\u email
。在所有模型中定义所有可能的列组合是可笑的,因此Rails重载
method\u missing
,并在那里构造相关的SQL查询

此外,当您要使用
method\u missing
响应方法调用时,您可以覆盖Ruby的
respond\u to?
方法

下面是一个例子:

class Foo
  def method_missing(meth, *args, &block)
    if meth == :bar
      puts 'yep!'
    else
      super
    end
  end

  def respond_to?(meth)
    if meth == :bar
      true
    else
      super
    end
  end
end

foo = Foo.new
foo.methods.include?(:bar)
# => false
foo.respond_to?(:bar)
# => true

哪种版本的Rails?啊,对不起,我没想到;3.2hm,好的。。我知道方法_缺失,以及如何使用它来启用所有的动态查找程序——但如果我理解正确的话,这些都是模型类的类方法。然而,在这里,我们得到了一系列这样的模型;该数组实例支持查询“helpers”;所有这些“where”和“paginate”和“order”还有其他什么。如果我做对了(很可能我弄错了),它们既不是实例,也不是模型的类方法。我想这一定有点像Django的QuerySet API。现在需要深入研究RoR文档……Rails在幕后使用了一种称为AssociationProxy的东西来支持这种行为。在Rails 4中更显式一些——例如,在我的应用程序中,
User.first.assignments.class
返回ActiveRecord::Associations::CollectionProxy::ActiveRecord\u Associations\u CollectionProxy\u Assignment。AssociationProxies是所有这些查找器方法等活动的地方。