我正在研究一個很是基本的購物車系統。 git
我有一個表items
,其列price
爲integer
類型。 數據庫
我沒法在包括歐元和美分在內的價格中顯示價格值。 就Rails框架中的處理貨幣而言,我是否遺漏了一些明顯的東西? app
處理貨幣的經常使用作法是使用十進制類型。 如下是「使用Rails進行敏捷Web開發」的簡單示例 框架
add_column :products, :price, :decimal, :precision => 8, :scale => 2
這將容許您處理從-999,999.99到999,999.99的價格
您可能還但願在項目中包含驗證 spa
def validate errors.add(:price, "should be at least 0.01") if price.nil? || price < 0.01 end
理智 - 檢查你的價值觀。 code
您可能但願在數據庫中使用DECIMAL
類型。 在遷移中,執行如下操做: ci
# precision is the total number of digits # scale is the number of digits to the right of the decimal point add_column :items, :price, :decimal, :precision => 8, :scale => 2
在Rails中, :decimal
類型做爲BigDecimal
返回,這對於價格計算頗有用。 開發
若是你堅持使用整數,你將不得不手動轉換到BigDecimal
的全部地方,這可能只是一個痛苦。 get
正如mcl所指出的,要打印價格,請使用: 產品
number_to_currency(price, :unit => "€") #=> €1,234.01
絕對是整數 。
即便BigDecimal在技術上存在, 1.5
仍將爲您提供Ruby中的純Float。
使用虛擬屬性(連接到修訂(付費)Railscast),您能夠將price_in_cents存儲在整數列中,並在產品模型中添加虛擬屬性price_in_dollars做爲getter和setter。
# Add a price_in_cents integer column $ rails g migration add_price_in_cents_to_products price_in_cents:integer # Use virtual attributes in your Product model # app/models/product.rb def price_in_dollars price_in_cents.to_d/100 if price_in_cents end def price_in_dollars=(dollars) self.price_in_cents = dollars.to_d*100 if dollars.present? end
來源: RailsCasts#016: 虛擬屬性 : 虛擬屬性是添加不直接映射到數據庫的表單字段的簡潔方法。 在這裏,我將展現如何處理驗證,關聯等。
若是有人使用續集,遷移將看起來像:
add_column :products, :price, "decimal(8,2)"
不知怎的,Sequel忽略了:精確度和:規模
(續集版本:續集(3.39.0,3.38.0))