我期待9
,但得到nil
。不知道为什么。
> dfs = p.disk_items.inject { |acc, di| acc + 1 if di.type == "DiskFile" }
=> nil
同样的问题:
> dfs = p.disk_items.inject(0) { |acc, di| if di.type == "DiskFile" then acc + 1 end }
=> nil
显然,di.type == "DiskFile"
为真的情况有九种:
> dfs = p.disk_items.inject(0) { |acc, di| puts di.type == "DiskFile" }
true
true
true
true
true
true
true
true
true
false
=> nil
我搞砸了什么?如果我不能使用条件,那么可能有一种更好的方法来计算数组中满足属性条件的所有ActiveRecord
对象。
编辑:FWIW:
> p.disk_items.class
=> ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_DiskItem
看起来count
的Rails源代码中的这个实现可能不接受块?虽然我可能读错了或者看错了地方。。。
user2246674是正确的,if语句返回nil,但inject应该始终返回acc
。您可以使用turnery运算符来简化
dfs = p.disk_items.inject(0) { |acc, di| di.type == "DiskFile" ? acc + 1 : acc }
当if
"未运行"时,块求值为nil
。这种情况发生在最后一种情况下,并返回结果(nil
)。
考虑(长手):
if di.type == "DiskFile" then
acc + 1
else
acc # so we never return nil
end
虽然有各种各样的短手(即?:),但我会使用count {block}
。如果需要对值执行其他操作(可能仍在"有时"的注入中使用),select
可能也很有用。
p.disk_items.count{|di|di.type=="DiskFile"}