我开始从Rails 4.1.4升级到Rails 4.2.0。看起来在某些活动记录关联上不再支持first!。
首先,什么导致了在ActiveRecord :: Associations :: CollectionProxy 上的first!失败?
如何修复此行为,使其像4.1.4中一样工作?
Rails 4.1:
(byebug) user.organization.registration_codes
#<ActiveRecord::Associations::CollectionProxy [#<RegistrationCode id: 259, code: "AWESOMESAUCE" ... >]>
(byebug) user.organization.registration_codes.first!
#<RegistrationCode id: 259, code: "AWESOMESAUCE" ... >
Rails 4.2:
(byebug) user.organization.registration_codes
#<ActiveRecord::Associations::CollectionProxy [#<RegistrationCode id: 259, code: "AWESOMESAUCE" ... >]>
(byebug) user.organization.registration_codes.first!
NoMethodError Exception: undefined method `[]' for nil:NilClass
nil
更新
深入研究ActiveRecord后,我发现它在这里出现了故障:
def find_nth(index, offset)
if loaded?
@records[index]
else
offset += index
@offsets[offset] ||= find_nth_with_limit(offset, 1).first
end
end
loaded?
返回为true,但@records为空。通过调用find_nth_with_limit(offset, 1).first
并在其中抛出调试器,可以返回我期望的记录。
first!
在active record的finder_methods.rb中定义。问题似乎在于该关联认为已经加载了,但@records为空。
first!
定义在哪里?因为我在任何文档或来源中都找不到它。 - engineersmnky