论坛首页 编程语言技术论坛

amount_in_yuan

浏览 3965 次
锁定老帖子 主题:amount_in_yuan
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-23  
Agile Web Development On Rails书中建议金额用integer,单位是cents,好处XX。但是每个金额的field都要写两个method:amount_in_dollar和amount_in_dollar=,不如写个类似于attr_accessor的meta program,一次搞定。两段例子如下:

# config/enviorment.rb
class Module
    def amounts_in_yuan(*args)
      args.each do |sym|
        class_eval %{
          def #{sym}_in_yuan
            amt = self.#{sym} || 0
            sprintf("¥%01.2f", amt.to_f/100)
          end

          def #{sym}_in_yuan=(amt)
            amt.sub!('¥', '') if amt.starts_with?('¥')
            self.#{sym} = (amt.to_f * 100).to_i
          end
        }
      end
    end
end


# db/migrate/001_create_products.rb
class CreateProducts < ActiveRecord::Migration
  def self.up
    create_table :products do |t|
      t.column :price, :integer    # 金额定义为integer,单位为分
      t.column :cost, :integer
      ...
    end
  end
  ... 
end


# app/models/product.rb
class Product < ActiveRecord::Base
  amounts_in_yuan :price, :cost
  ...
end


<%# app/views/products/edit.rhtml %>
...
单价:<%= f.text_field :product, :price_in_yuan %>元
成本:<%= f.text_field :product, :cost_in_yuan %>元
...
   发表时间:2007-01-24  
看那本书第二版。现在提倡的做法是用一个BigDecimal字段来保存价格。
0 请登录后投票
   发表时间:2007-01-24  
看到了,谢谢!
add_column :products, :price, :decimal, :precision => 8, :scale => 2
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics