2013-01-24 50 views
2

我有两个相关模型:InvoiceCurrency查找对象集合是否具有给定属性的相同值

Invoice belongs_to CurrencyCurrency has_many Invoices

我有显示每个发票的名单表,我能够通过货币来进行筛选。发票也有一个price字段,我有一个方法可以计算我显示的发票的总价格。

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

我很确定有一个简单的方法来实现这个,但我找不到它。

任何帮助将不胜感激。

回答

4

其实有很多方法可以做到这一点,例如,你可以检查是否所有的人都有相同的货币是这样的:

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

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

我会测试'inv.currency_id'而不是问Rails的每一个货币作为Ruby对象转换,然后让它们的ID。生成少一点的DB查询 – MrYoshiji

+0

当然。现在修好! –

+0

它的工作原理,非常感谢! – siekfried

1

最直接的方式来问一个集合中的所有内容是否相同是问所有元素是否等于第一个:

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

如果你做这件事情很多,可以考虑扩展可枚举有一个方便的方法:

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

invoices.map(&:currency_id).all_same? 
+0

这正是我问自己的问题。谢谢你的提示。 – siekfried

相关问题