使用嵌入的条件注入..可能的



我期待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"}

最新更新