假设我有一个模特。
乘客属于航班。 航班属于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保存会与此类似吗?
感谢您的帮助!
答案 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>