我有以下任务要做:
有两种模式:订单和用户,还有用于构建新订单的表单。此表单必须包含用于构建用户关联的字段 - 名称,电话。我没有遇到任何问题;我应该在Order模型中使用accept_nested_attributes并使用嵌套User构建Order,这没关系。但是,如果已存在具有相同电话的用户,则我希望将新订单的user_id安装为现有用户的user_id,而不创建新用户。我怎样才能做得更好?我不知道如何使用某些条件建立关联。提前致谢。
答案 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
方法,但是因为您要允许不同条件下的不同属性,所以如果将它们分开,它们会更好。