使用Rails 5

时间:2017-03-03 06:40:28

标签: ruby-on-rails postgresql ruby-on-rails-5

我们正在将我们的应用程序从Rails 4.2升级到Rails 5.0。

我们发现相同的请求在插入数据库时​​会生成不同的sql。数据库列是JSON,它看起来像在Rails 5.0中,它被存储为转义字符串。

有谁知道我们如何确保版本之间的相同行为?

请求参数:

参数:{" provider_package_item" => {" provider_package_id" =>" 2"," service_id" =>& #34; 6"," service_product_id" =>" 17"," provider_price_list_id" =>" 12",&# 34; provider_price_list_item_id" =>" 122","选项" =>" [{\" id \":95,\ "标题\":\"完成\" \"值\":{\" ID为\":\& #34; 130 \" \"标题\":\"缎\" \"价格\":0}}, {\" id \":96,\"标题\":\"纸张重量\","值\&#34 ;:{\" ID为\":\" 135 \" \"标题\":\"为200gsm \" ,\"价格\":0}},{\" ID为\":112,\"标题\":\"交付\" \"值\":{\" ID为\":\" 189 \" \"标题\ ":\"下一天\",\"价格":0}}]"}}

Rails 4.2中的数据库查询:

INSERT INTO" provider_package_items" (" provider_package_id"," service_id"," service_product_id"," provider_price_list_id"," provider_price_list_item_id","选项","标题","数量","价格"," options_string"," created_at", " updated_at")VALUES($ 1,$ 2,$ 3,$ 4,$ 5,$ 6,$ 7,$ 8,$ 9,$ 10,$ 11,$ 12)返回" id" [[" provider_package_id",2],[" service_id",6],[" service_product_id",17],[" provider_price_list_id", 12],[" provider_price_list_item_id",122],["选项"," [{\" id \":95,\&#34 ;标题\":\"完成\" \"值\":{\" ID为\":\" 130 \" \"标题\":\"缎\" \"价格\":0}},{\& #34; id \":96,\" title \":\"纸张重量\",\"值\":{ \" ID为\":\" 135 \" \"标题\":\"为200gsm \" \& #34;价格\":0}},{\" ID为\":112,\"标题\":\"交付\&# 34; \"值\":{\" ID为\":\" 189 \" \"标题\&#34 ;:"下一天\",\"价格":0}}]"],["标题",&#34 ; A4宣传册"],["数量",50],["价格",65.0],[" options_string"," / Satin / 200GSM /次日"],[" created_at"," 2017-03-03 05:36:51.613297"],[" updated_at", " 2017-03-03 05:36:51.613297&#3 4;]]

Rails 5.0中的数据库查询

INSERT INTO" provider_package_items" ("标题"," service_id"," service_product_id"," provider_price_list_id"," provider_price_list_item_id","数量","选项"," options_string"," created_at"," updated_at"," provider_package_id", "价格")价值($ 1,$ 2,$ 3,$ 4,$ 5,$ 6,$ 7,$ 8,$ 9,$ 10,$ 11,$ 12)返回" id" [["标题"," A4宣传册"],[" service_id",6],[" service_product_id",17],[& #34; provider_price_list_id",12],[" provider_price_list_item_id",122],["数量",50],["选项",&#34 ; \" [{\\" ID \\":95,\\"标题\\":\\"完成\\&#34 ;,\\"值\\":{\\" ID \\":\\" 130 \\",\\&#34 ;标题\\":\\"缎\\",\\"价格\\":0}},{\\" ID为\ \":96,\\" title \\":\\"纸张重量\\",\\"值\\" :{\\" ID \\":\\" 135 \\",\\"标题\\":\\"为200gsm \\",\\"价格\\":0}},{\\" ID \\":112,\\"标题\\":\\"交付\\",\\"值\\":{\\" ID \\&#34 ;: \\" 189 \\",\\" title \\":\\"次日\\",\\"价格\\":0}}] \""],[" options_string"," / Satin / 200GSM /次日"],[& #34; created_at",2017-03-03 05:30:02 UTC],[" updated_at",2017-03-03 05:30:02 UTC],[" provider_p ackage_id",2],["价格",65.0]]

2 个答案:

答案 0 :(得分:0)

Rails 5已更新为符合RFC 7159. JSON字符串,例如来自Javascript的JSON.stringify()现在保存为字符串而不是哈希/数组。要保持以前版本的Rails的行为,您需要在分配之前解析JSON字符串:

Model.payload = JSON.parse("{\"key\":\"value\"}")

或者您可以覆盖模型中的setter方法:

def payload=(value)
  self[:payload] = value.is_a?(String) ? JSON.parse(value) : value
end

答案 1 :(得分:0)

https://github.com/rails/rails/issues/28292

肯里夫(Kengreeff)的观察

在控制台中(Rails 4.2.2)

item = OrderItem.new(options: "{\"key\":\"value\"}")
 => #<OrderItem id: nil, options: {"key"=>"value"}>

item.options
 => {"key"=>"value"} 

item.options.is_a?(String)
 => false 

item.options.is_a?(Hash)
 => true

在控制台中(Rails 5.0.2)

item = OrderItem.new(options: "{\"key\":\"value\"}")
 => #<OrderItem id: nil, options: "{\"key\":\"value\"}">

item.options
 => "{\"key\":\"value\"}"

item.options.is_a?(String)
 => true 

item.options.is_a?(Hash)
 => false

kamipo提到了此

轨道5

此行为是因为efaa6e4可以解决问题#24234。 请使用

OrderItem.new(options: JSON.parse("{\"key\":\"value\"}")).