如何使用rails在has_many关系上创建关联对象?

时间:2012-08-20 16:08:44

标签: ruby-on-rails save has-many

我正在使用Rails 3.2实现一个简单的航班系统 但是当我想要保存订单时,我有一个问题,可能有很多乘客。也就是说,他们两个是一对多的关系。 这是乘客的模型。

class Passenger < ActiveRecord::Base
  attr_accessible :accident_number, :cred_number, :cred_type, :delay_number, :name, :order_id
  validates :cred_type, :cred_number, :name, presence: true
  belongs_to :order, :inverse_of => :passengers
end

这是Order的型号

class Order < ActiveRecord::Base
  attr_accessible :contact_email, :contact_name, :contact_phone, :flight_id, :print_time, :remark
  validates :contact_email, :contact_name, :contact_phone, :flight_id, :print_time, presence: true

  belongs_to :flight

  has_many :passengers, :dependent => :destroy, :inverse_of => :order
  accepts_nested_attributes_for :passengers, :allow_destroy => true
  attr_accessible :passengers_attributes, :allow_destroy => true

end

params就像这样

Parameters: {
"passengers"=>{"new_1"=>{"name"=>"Passenger 1", "cred_type"=>"ID card", 
"cred_number"=>"12345", "accident_number"=>"1", "delay_number"=>"1"},
"new_2"=>{"name"=>"Passenger 2", "cred_type"=>"ID card", "cred_number"=>"54321", "accident_number"=>"1", "delay_number"=>"1"}}, 
"order"=>{"contact_name"=>"Contact 1", "contact_phone"=>"123456", "contact_email"=>"test2@tset,com", "print_time"=>"1", "remark"=>""}, 
"commit"=>"Create Order"}

问题在于订单,乘客无法得到保存。 我尝试了一些方法,但他们无法解决它......例如

def create                              
  @order = Order.new(params[:order])    

  respond_to do |format|                
    if @order.save                      
      params[:passengers].each do |k, v|
        @order.passengers.create(v)     
      end

提前感谢!!

2 个答案:

答案 0 :(得分:0)

我认为如果您的params在订单哈希中有乘客收集,您可以简单地执行以下操作来保存:

def create                              
  @order = Order.new(params[:order])    
  respond_to do |format|                
    if @order.save
      / something else
    end
  end
end

如果您的关系设置正确,则不需要自己保存子对象。

答案 1 :(得分:0)

使用accepts_nested_attributes_for应该使用密钥:passengers_attributes返回Order params中的乘客参数。

您需要在:passengers_attributes电话中添加attr_accessible,并查看您的表单奇怪地格式化params散列的原因。您可以发布表单的视图代码吗?