使用Rails 4中的某些条件与accepts_nested_attributes建立关联

时间:2014-06-11 06:22:01

标签: ruby-on-rails

我有以下任务要做:

有两种模式:订单和用户,还有用于构建新订单的表单。此表单必须包含用于构建用户关联的字段 - 名称,电话。我没有遇到任何问题;我应该在Order模型中使用accept_nested_attributes并使用嵌套User构建Order,这没关系。但是,如果已存在具有相同电话的用户,则我希望将新订单的user_id安装为现有用户的user_id,而不创建新用户。我怎样才能做得更好?我不知道如何使用某些条件建立关联。提前致谢。

2 个答案:

答案 0 :(得分:1)

@user = User.find_or_create_by(phone_number: params[:phone_number])

这样,只有在不存在的情况下才会创建用户记录,从而消除重复。

答案 1 :(得分:0)

创建order_controller.rb的行动中,您可以执行以下操作

def create
  @user = User.find(params[:phone_number])
  if @user
    @order = @user.build_orders(order_params_without_user)
    if @order.save
      redirect_to your_path
    else
      render new
    end
  else
    @order = Order.new(order_params_with_user)
    if @order.save
      redirect_to your_path
    else
      render new
    end
  end
end

private

def order_params_without_user
  params.require(:order).permit(order attributes)
end

def order_params_with_user
  params.require(:order).permit(order_attributes, user_attributes: [ user_attributes ])
end

您可以通过在方法中分离@ order.save if-else块然后在create action中调用该方法来进一步简化它:

def create
  @user = User.find(params[:phone_number])
  if @user
    @order = @user.build_orders(order_params_without_user)
    order_save(@order)
  else
    @order = Order.new(order_params_with_user)
    order_save(@order)
  end
end

private

def order_params_without_user
  params.require(:order).permit(order attributes)
end

def order_params_with_user
  params.require(:order).permit(order_attributes, user_attributes: [ user_attributes ])
end

def order_save(order)
  if order.save
    redirect_to your_path
  else
    render new
  end
end

如果您使用的是rails 4,则可以使用 order_params_with_user order_params_without_user 两种私有方法,允许在order_params_with_user 中使用用户属性,然后只需传递他们在if-else块上。

正如您在评论how can i use find_or_create中提到的那样,如果您使用的是rails 4,那么您必须允许自己的属性,然后将其传递给find_or_create方法,但是因为您要允许不同条件下的不同属性,所以如果将它们分开,它们会更好。