我想做这样的事情:
@residenciais, @comerciais = TipoImovel.all.split { |t| t.residencial? }
问题是@comerciais
总是空的,因为它从不返回对象,因为条件是false。
有更好的方法吗?
您正在寻找标准方法Enumerable#partition
,而不是Railssplit
插件。
@residenciais, @comerciais = TipoImovel.all.partition { |t| t.residencial? }
也可以这样写,因为条件是单个方法调用:
@residenciais, @comerciais = TipoImovel.all.partition(&:residencial?)
更多解释:
RailsArray#split
方法用于将数组分隔为有序的组,这些组由给定块返回true的元素分隔。它是标准String方法的推广。例如:
[1,2,3,4,5,6].split(&:odd?) #=> [[], [2], [4], [6]]
任何奇数都是一个分隔符,因此它按顺序返回奇数之间的数组部分。
而这更接近于你正在做的事情:
odds, evens = [1,2,3,4,5,6].partition(&:odd?) #=> [[1, 3, 5], [2, 4, 6]]
如果分区条件不是简单的布尔条件,或者如果你想不管怎样都关闭值,那么你可以使用Enumerable#group_by
,它返回数组的哈希,而不是一对:
[1,2,3,4,5,6].group_by(&:odd?) #=> {true=>[1, 3, 5], false=>[2, 4, 6]}
您可以使用group_by
:
@residenciais, @comerciais = TipoImovel.all.group_by { |t| t.residencial }.values