他の人のお金を数える方法

レール用に100万がすでに作成されており、お金で動作するアプリケーションを突然作成する必要がある場合の対処方法に関するチュートリアルが1つあります。



通常、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
      
      






All Articles