ActiveRecord中的Ruby类型的集合
发布时间:2020-12-16 22:45:38 所属栏目:百科 来源:网络整理
导读:如果我在ActiveRecord中有一个包含子对象集合的对象,即 class Foo ActiveRecord::Base has_many :bars,...end 我试图针对该集合运行Array的find方法: foo_instance.bars.find { ... } 我收到: ActiveRecord::RecordNotFound: Couldn't find Bar without an
如果我在ActiveRecord中有一个包含子对象集合的对象,即
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 任何人可以帮助我解释这个,并通过元编程来解决这个问题吗? 解决方法
正如其他人所说,关联对象实际上并不是一个数组.要找出真正的课程,请在irb中进行:
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,它是实际的底层数组实例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |