有没有一种方法可以通过两个不同的分隔符来分割Rails中的对象数组



我想做这样的事情:

@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

最新更新