大佬教程收集整理的这篇文章主要介绍了ActiveRecord中的Ruby类型的集合,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
class Foo < ActiveRecord::Base has_many :bars,... end
我试图针对该集合运行Array的find方法:
foo_instance.bars.find { ... }
我收到:
ActiveRecord::RecordNotFound: Couldn't find Bar without an ID
我认为这是因为ActiveRecord已经为了自己的目的而劫持了find方法.现在,我可以使用检测,一切都很好.然而为了满足我自己的好奇心,我试图用metaprogramming来显式地将find方法重新开始一次:
unbound_method = [].method('find').unbind unbound_method.bind(foo_instance.bars).call { ... }
我收到这个错误:
TypeError: bind argument must be an instance of Array
所以很明显Ruby不认为foo_instance.bars是一个数组,但是:
foo_instance.bars.instance_of?(Array) -> true
任何人可以帮助我解释这个,并通过元编程来解决这个问题吗?
class << foo_instance.bars self end # => #<Class:#<ActiveRecord::Associations::HasManyAssociation:0x1704684>> ActiveRecord::Associations::HasManyAssociation.ancestors # => [ActiveRecord::Associations::HasManyAssociation,ActiveRecord::Associations::AssociationCollection,ActiveRecord::Associations::AssociationProxy,Object,Kernel]
为了摆脱当您执行foo_instance.bars.find()时调用的ActiveRecord :: Bse#find方法,以下内容将有助于:
class << foo_instance.bars undef find end foo_instance.bars.find {...} # Array#find is now called
这是因为AssociationProxy类将它不知道的所有方法(通过method_missing)委托给它的#target,它是实际的底层数组实例.
以上是大佬教程为你收集整理的ActiveRecord中的Ruby类型的集合全部内容,希望文章能够帮你解决ActiveRecord中的Ruby类型的集合所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。