通常、Floatを使用しない、Decimalを使用する、すべての種類のトランザクションなどがあるというアドバイスになります。 そして、ほとんどの場合、これらのヒントは開発者をドライで快適に感じるのに十分です。
たとえば、アプリケーションが複数の国の居住者にサービスを提供する必要がある状況に遭遇しましたか?
ここに仮想的な状況があります:アプリケーションは、たとえば、有料の漫画など、
お金
そして、ここで税ヘムが
money
日の救世主の輝く鎧で。 彼は必要なことだけを行うことができます。
# 5 dollars = Money.new(500, 'USD') # 10 ! euros = Money.new(1000, 'EUR') # # euros > dollars # => true # euros.exchange_to('USD') # => #<Money cents:1408 currency:USD> # !!11 Money.new(1000, 'USD') + Money.new(1000, 'EUR') # => #<Money cents:2408 currency:USD>
一般的に、美しさなど。
休日を覆い隠す唯一のものは、鉄道モデルに接続するための非常に重要なメカニズムです。 このようなもの:
# Gemfile gem 'money' gem 'google_currency', :require => 'money/bank/google_currency' # cartoon.rb class Cartoon < ActiveRecord::Base composed_of :price, :class_name => 'Money', :mapping => [[ 'price_in_cents', 'cents' ], [ 'currency', 'currency_as_string' ]], :constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency || Money.default_currency) }, :converter => Proc.new { |value| value.respond_to?(:to_money) ? value.to_money : raise(ArgumentError, "Can't convert #{value.class} to Money") } end # migration create_table :cartoons do |t| # ... t.integer :price_in_cents, :default => 0, :null => false t.string :price_currency, :limit => 3, :null => false # ... end
そして、これは1つのモデルのみです。 そして、通貨が相互に変換されるようにイニシャライザーを書くことを忘れてはいけません:
# intializers/money.rb Money.default_bank = Money::Bank::GoogleCurrency.new
偽造品
要するに、このコードを3番目のモデルに続けてコピーしたとき、全体を少し単純化するシンプルな宝石を書くという思いが頭に浮かびました。 まあ、私は書いた。
それは偽造と呼ばれます。
フェルトブーツのように機能します。
# Gemfile gem 'counterfeit' # cartoon.rb class Cartoon < ActiveRecord::Base has_counterfeit :price # # :currency => 'RUB' # , . # :currency_attribute => :price_currency, # :amount_attribute => :price_in_cents end # migration create_table :cartoons do |t| # ... t.money :price # ... end
Googleは交換機として設定されていますが、標準のコンベクターで通貨を変換しようとして最初に失敗した場合のみです。 標準的なものは、彼の手でコースを処方する必要があります-あなたはこれを始めることはまずないでしょう?
一般に、有料の漫画を使用してアプリケーションを作成する必要がある場合は、偽造を試してください。 そして、あなたはバグを見つけるでしょう-書いてください。
しかし、待って、もっとあります
最初にエラーなしで偽造という単語を印刷する人はほとんどいないと言われたため、特にこれらの人のために魔法のエイリアスが作成されました:
class Cartoon < ActiveRecord::Base has_money :price # , ? end