2017-08-29 36 views
1

在我的Rails 5應用程序中,我閱讀了產品的訂閱源。在JSON中,當價格超過1000美元時,JSON有一個逗號,比如1,000。成千上萬的滑軌數量被截斷

我的代碼似乎是截斷它,所以它存儲爲1而不是1,000。

所有其他字段都正確存儲。有人可以告訴我我做錯了什麼嗎?

在這個例子中,reg_price保存爲2,而不是2590

JSON試樣(reg_price字段):

[ 
    { 
    "reg_price": "2,590" 
    } 
] 

架構

create_table "products", force: :cascade do |t| 
    t.decimal "reg_price",       precision: 10, scale: 2 
end 

模型

response = open_url(url_string).to_s 
products = JSON.parse(response) 

products.each do |product| 
    product = Product.new(
    reg_price: item['reg_price'] 
) 
    product.save 
end 

回答

2

你沒有做錯什麼。小數點不能與逗號分隔符一起使用。我不確定是否有一個很好的方法來解決這個問題。但作爲一個選項,你可以定義一個虛擬屬性:

def reg_price=(reg_price) 
    self[:reg_price] = reg_price.gsub(',', '') 
end 
+2

由於有時價格表示爲'2,999',可能*表示2999和'2,99',如果使用歐洲表示法則表示2.99。 – tadman

+0

Imo,'reg_price.delete(',')'更直接,讀得更好。 –

2

這種情況發生的原因與Rails無關。

  1. JSON是一個非常簡單的文檔結構,不支持任何數字分隔符。您的JSON文檔中的值是字符串。
  2. 當您收到一個字符串作爲輸入,並且想要將其存儲爲整數時,您需要將其轉換爲適當的類型。
  3. 紅寶石已經內置支持這一點,和Rails使用它:"1".to_s #=> 1
  4. 特定啓發式的Ruby使用的字符串轉換爲整數採取任何數量最多的非數字字符,並投它作爲整數。在Ruby中,逗號是非數字的,至少默認情況下是。

解決方法是使用另一種方法將JSON中的字符串值轉換爲整數。您可以通過以下任何一種方式執行此操作:

  1. 在將字符串發送到ActiveRecord模型之前將其轉換爲整數。
  2. 以這種方式修改字符串,以便默認的Ruby投射將字符串轉換爲預期值。
  3. 使用自定義腳本來處理此特定屬性(ActiveRecord和ActiveModel內部)的投射。

@Danil提出的解決方案如下#2,它有一些缺點(正如@tadman指出的那樣)。

處理這個問題的一種更加可靠的方式就是使用像Delocalize這樣的庫,它會自動處理數字字符串解析和轉換,並考慮活動語言環境使用的分隔符。見this excellent answer by Benoit Garret for more information