将嵌套的JSON对象保存到数据库

时间:2013-08-12 11:37:50

标签: ruby ruby-on-rails-4

假设我有一个模特。

乘客属于航班。 航班属于Trips

class Trip < ActiveRecord::Base    
    has_many :flights, :dependent => :destroy, :order => "order_num ASC"    
end


class Flight < ActiveRecord::Base
    belongs_to :trip, touch: true
    has_many :passengers, :dependent => :destroy
end

class Passenger < ActiveRecord::Base
    belongs_to :flight, touch: true
end

我将这个发送回rails应用程序。 (当用户呼叫保存时)。

*最高级别是旅程

{    
    name: 'Hello Trip',
    date: '2013-08-12',
    flights: [
        {
            id: 1
            depart_airport: 'RDU',
            arrive_airport: 'RDU',
            passengers: [
                {
                    user_id: 1,
                    request: true
                }
            ]
        },

        {

            depart_airport: 'RDU',
            arrive_airport: 'RDU',
            passengers: [
                {
                    user_id: 1,
                    request: true
                },
                {
                    user_id: 2
                    request:true
                }
            ]
        }

    ]
}

现在我正在获取保存的json并手动循环浏览航班以查看是否有id。如果我有更新它。如果不是我正在创建一个新的。然后加上乘客。

我想知道Rails是否有自动格式可以为我做所有的保存。我知道当你提交一个嵌套的表单时,它会创建一个类似的模式,并添加一个_destroy属性,如果它刚刚创建,则id是一个时间戳。 JSON保存会与此类似吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

是的,你应该可以在这里使用accepts_nested_attributes_for

您需要在模型上启用accepts_nested_attributes_for,例如

class Trip < ActiveRecord::Base    
  has_many :flights, :dependent => :destroy, :order => "order_num ASC" 
  accepts_nested_attributes_for :flights, :allow_destroy => true
  attr_accessible :flights_attributes
end

您还需要确保您的JSON响应使用Rails将识别的密钥。您可以修改JSON响应或执行以下操作:

response = JSON.parse(json_string)
response[:flights_attributes] = response.delete(:flights)
# ...

然后你可以做

Trip.create(response)

您需要确保按预期创建/更新所有内容。有关accepts_nested_attributes_for的更多信息,请参阅文档:http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for

我认为accepts_nested_attributes_for很方便,但请注意,有些人认为应该弃用它(例如:http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/,请点击此处查看回复:https://stackoverflow.com/a/17639029/1614607)。< / p>