如何将Ruby hash rocket转换为有效的JSON?

时间:2015-07-13 18:02:55

标签: ruby-on-rails ruby json ruby-on-rails-4 rails-activerecord

我尝试获取这种JSON数据:

[
   {
      "id":3,
      "foods": [{'id':2,'name':'Nasi Minyak','qty':6},{'id':14,'name':'Kuey teow','qty':3}]
   },
   {
      "id":4,
      "foods": [{'id':2,'name':'Nasi Minyak','qty':1},{'id':14,'name':'Kuey teow','qty':1}]
   }
]

请注意,"对象的开头和结尾没有双引号foods

我现在拥有的是这样的:

[
       {
          "id":3,
          "foods": "[{:id=>2, :name=>"Nasi Minyak", :qty=>6}, {:id=>14, :name=>"Kuey teow", :qty=>3}]"
       },
       {
          "id":4,
          "foods": "[{:id=>2, :name=>"Nasi Minyak", :qty=>1}, {:id=>14, :name=>"Kuey teow", :qty=>1}]"
       }
    ]

显然,它是一个字符串而不是我想要的数组。这给我带来了问题,因为我需要将这个JSON数据用于我的应用程序的前端(使用Angular构建并使用AJAX / $http进行大量操作)。

我的控制器内有这个:

class Api::OrderController < ApplicationController

    # GET /api/orders
    def index
        @orders = Order.all

        render json: @orders
    end

end

这是我的order_serializer文件。

class OrderSerializer < ActiveModel::Serializer
  attributes :id, :foods
end

我尝试过:

尝试#1

我尝试将订单模式更改为以下内容:

class Order < ActiveRecord::Base
    serialize :foods, Array
end

然后我尝试update_attributes foods使用rails控制台,如下所示:

o.update_attributes :foods => [{'id':2,'name':'Nasi Minyak','qty':6},{'id':14,'name':'Kuey teow','qty':3}]

但那对我不起作用。 JSON数据仍处于哈希火箭中。

尝试#2

我尝试to_json。但它仍然没有用。

如何摆脱双引号"标记并在Rails中正确保存有效的JSON数组?

注意

我的数据库中的foods列是text。不是string。我认为这与这个问题无关。

我发现了这个tutorial,但我看不到这样做。

2 个答案:

答案 0 :(得分:0)

你应该创建一个名为Food的类和另一个名为OrderItem的类,然后在Order类中你应该定义一个关系:

has_many :order_items
has_many :food, :through => order_items

这样你就有两个独立的类:Order和Food,通过OrderItem类,你可以创建它们之间的关系,这样就可以保持逻辑分离。

每种食物都有自己的名称和ID,但数量会转到OrderItem表。

答案 1 :(得分:0)

试试这个:

render json: @orders.to_json

如果您的应用是API,请尝试使用active_model_serializers gem。 它返回序列化的模型。

更新:

class OrderSerializer < ActiveModel::Serializer
  attributes :id
  has_many :foods
end

render json: @orders