如何删除“.each do”中的重复元素?

时间:2015-05-23 22:57:38

标签: ruby-on-rails ruby

<% @purchased.each do |sale|  %>
Receipt | <%= link_to sale.product.title, pickup_path(sale.guid) %>
<% end %>

结果是

Receipt | A1 |

Receipt | B1 |

Receipt | A2 |

Receipt | B2 |

Receipt | A1 |

Receipt | B1 |

而不是

Receipt | A1 |

Receipt | B1 |

Receipt | A2 |

Receipt | B2 |

我被告知使用array = array.uniq,但我不确定如何在代码中实现它。

1 个答案:

答案 0 :(得分:1)

使用uniq,例如:

<% @purchased.uniq.each do |sale|  %>

如果是我的代码库,我宁愿在控制器中执行uniq,例如:

@purchased_uniq = @purchased.uniq

或者,如果您从未需要其他@purchased项目,那么我将使用破坏性的“!”来执行控制器uniq。方法,例如:

@purchased.uniq!

如果您的@purchased数组包含不同对象的对象(例如模型),但某些对象与同一产品关联,并且您希望根据产品执行uniq,则可以使用块,例如:

@purchased.uniq!{|obj| obj.product }

或按标题:

@purchased.uniq!{|obj| obj.product.title }

请注意,您要小心使用这种代码,因为这种代码很容易导致错误,例如,如果用户对同一产品进行多次购买。我建议编写专门涵盖具有多个相同产品的用户的测试代码。此外,您可能希望确保每个产品都具有唯一标题,例如使用数据库约束(以及可选的Rails模型验证唯一性)。