Ruby on rails ActiveRecord查询方法响应-需要取消限制
简介:Rails 3.2;'a'是一个对象,也是一个ActiveRecord模型,它有许多消息(也是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) =>错误 ? 发生了什么事?显然这里有一些红宝石魔法,这使得这些探索物体的方法产生了不同的
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是所有这些查找器方法等活动的地方。