2012-08-09 78 views
1

在我的Contract表单中,我允许用户从下拉框中选择Unit,或者从一组复选框中选择多个单元。下拉字段的名称为unit_id,多个复选框的名称为multi_unit_ids[]。 (因为这两个选项都在页面上,所以我不能使用相同的名称)。Rails使用一个字段创建多个记录

每个单位选择一个合约。因此,如果只选择1个单位,那么只有一个Contractunit_id一起创建。但是,在选择多个单元时,所创建的每个Contract的所有数据都是相同的,但每个数据都有自己的单元ID(从multi_unit_ids数组中提取)。

下面是代码在我的我contracts_controller.rbcreate方法:

# Multiple Units? Multiple Contracts 
if params[:multi_unit_id] 
    unit_arr = params[:multi_unit_id] 
else 
    unit_arr = [*params[:contract][:unit_id]] 
end 


# Loop through units 
unit_arr.each do |unit_id| 
    # Assign the unit id to the params for easy creation 
    params[:contract][:unit_id] = unit_id 

    @contract = Contract.new(params[:contract]) 
    # ... other code here 
    @contract.save 
end 

这一切似乎都那么乱了!有什么更好的方法来做到这一点?

回答

1

那么我不能提出太多的建议,只要创建这些数据库条目没有循环去。我不确定这是否有可能,并且真正的循环似乎不够复杂,除非您忽略了# ... other code here部分的内容。

事实上,我即将提出的建议可能会让你感觉代码更加混乱。

如果您打算创建大量的数据库行,它很可能是一个好主意来包装循环中的ActiveRecord::Base.transaction类似于:

# Loop through units 
ActiveRecord::Base.transaction do 
    unit_arr.each do |unit_id| 
    # Assign the unit id to the params for easy creation 
    params[:contract][:unit_id] = unit_id 

    @contract = Contract.new(params[:contract]) 
    # ... other code here 
    @contract.save 
    end 
end 

或者以其他方式使用相结合创造的一些其他手段转换为单个查询(还有其他选项和基准,可在http://www.coffeepowered.net/2009/01/23/mass-inserting-data-in-rails-without-killing-your-performance/处获得)。但是,就重构而言,我不能在这里提供很多东西。

+0

感谢您的关注。这是我的困境的一部分,多个数据库插入。我一定会执行这些交易。谢谢! – 2012-08-10 00:13:24

相关问题