查找对象集合是否具有给定属性的相同值

时间:2013-01-24 15:35:39

标签: ruby-on-rails ruby ruby-on-rails-3

我有两个相关模型:InvoiceCurrency

Invoice belongs_to CurrencyCurrency has_many Invoices

我有一个表格,显示每张发票的清单,我可以按货币过滤它们。发票还有一个price字段,我有一个计算我显示的发票总价的方法。

我的问题是,当且仅当每张发票都有相同的货币时,我才想显示总价。

我很确定有一种简单的方法可以实现这一点,但我无法找到它。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

事实上,有很多方法可以实现这一点,例如,你可以通过这种方式检查它们是否都有相同的货币:

invoices.reject {|inv| inv.currency_id == invoices[0].currency_id}.empty?

invoices.map {|inv| inv.currency_id}.uniq.length == 1

答案 1 :(得分:2)

询问集合中的所有内容是否相同的最直接的方法是询问所有元素是否与第一个元素相同:

invoices.all?{ |inv| inv.currency_id == invoices.first.currency_id }

如果你经常做这件事,可以考虑使用便捷方法扩展Enumerable:

module Enumerable
  def all_same?
    v = first
    all? {|e| e == v}
  end
end

invoices.map(&:currency_id).all_same?