1

假设我有一个模型。

乘客属于航班。航班属于旅行

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保存会与此类似吗?

谢谢你的帮助!

4

1 回答 1

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 )。

于 2013-08-12T20:49:10.457 回答