我有以下型号:
Shop, :belongs_to => Currency
Product, :belongs_to => Shop
Company, :belongs_to => Currency
CompanyUser, :belongs_to => Company
UserTransaction, :belongs_to => CompanyUser
所以一家商店和一家公司都使用某种货币。这是货币的模型
include ActionView::Helpers
class Currency < ActiveRecord::Base
attr_accessible :description, :iso_code, :number_of_decimals, :symbol
def to_currency(number)
number_to_currency(number, :precision => self.number_of_decimals, :unit => self.symbol)
end
end
好的,现在当我想显示产品价格时,我可以这样做:
product.shop.currency.to_currency(product.price)
如果我想显示 CompanyUser 的余额,我可以这样做:
company_user.company.currency.to_currency(company_user.balance)
如果我想显示 UserTransaction 的价格,我需要这样做:
user_transaction.company_user.company.currency.to_currency(user_transaction.amount)
这一切都有效。但我想知道是否存在一种我可以应用的设计模式,它可以使 to_currency 在所有连接的对象中可用。请注意,它不仅仅是我可以使用的方法助手,因为有时它需要使用 Shop 的货币(例如使用 Product),有时还需要使用 Company 的货币(在 CompanyUser、UserTransaction 的情况下......)。
理想情况下,我想做:product.to_currency(product.price) 或 product.price.to_currency,它会通过检查商店的货币来查找要使用的货币。
此示例已简化,我还有几个其他模型需要转换的金额,但所有这些都可以连接到 Shop 或 Company。