обработка вложенных атрибутов в приложении rails 5 api only - PullRequest
0 голосов
/ 30 мая 2018

У меня есть требование в приложении rails api.У клиента может быть много заказов, и каждый заказ принадлежит клиенту.

class Client < ApplicationRecord
    has_many :orders
end

мой order.rb равен

class Order < ApplicationRecord
  belongs_to :client, dependent: :destroy
  accepts_nested_attributes_for :client
  validates_presence_of :order_amount, :service_amount, :miners_amount
end

У меня есть маршрут, выставленный / place_order , который создает клиента и заказы.

class OrderProcessingController < ApplicationController
    def place_order
        @order = Order.new(order_processing_params)
        if @order.save
            render json: @order
        else
            render json: @order.errors.full_messages
        end
    end

    private
    def order_processing_params
        params.require(:order).permit(:order_amount, :service_amount, :miners_amount, client_attributes: [:name, :email, :phone_number, :date])
    end
end

Пока все отлично работает.Теперь мое требование заключается в том, чтобы проверить, что клиент уже присутствует в таблице клиента.если да, добавьте client_id для заказов и создайте новый заказ.Я не хочу создавать новых клиентов и заказывать каждый раз.

как я могу добиться того же в before_filter или что-то в этом роде.получить клиент от клиента params и, если клиент присутствует, удалить ключ params из входящих параметров ???

данные поста для place_order выглядят следующим образом

{
     "order" : {
       "order_amount" : "10000",
        "service_amount" : "1000",
        "miners_amount" : "10000",
         "client_attributes": {
                "name": "Ajith",
                "email": "ajith@gmail.com",
                "phone_number": "12231321312",
                "date": "12/12/12"
            }
         }
  }

Заранее спасибо, Ajith

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я попробовал следующий подход, чтобы получить решение.не совсем уверен, что это правильный подход к проблеме

class OrderProcessingController < ApplicationController
    before_action :find_client, only: :place_order
    def place_order
        if @client.present?
            @order = @client.orders.build(order_processing_params) 
        else
            @order = Order.new(order_processing_params)

        end
        if @order.save
            render json: @order
        else
            render json: @order.errors.full_messages
        end
    end

    private
    def order_processing_params
        params.require(:order).permit(:order_amount, :service_amount, :miners_amount, client_attributes: [:name, :email, :phone_number, :date])
    end

    def find_client
        begin
            @client =  Client.find_by_email(params[:order][:client_attributes][:email])
        rescue
            nil
        end
    end
end

Спасибо, Аджит

0 голосов
/ 01 июня 2018

приведенный ниже код не проверен, в основном ваш подход должен быть примерно таким

class OrderProcessingController < ApplicationController
  before_action :find_client, only: [:place_order]

  def place_order
    @order = @client.orders.new(order_processing_params)

    if @order.save
        render json: @order
    else
        render json: @order.errors.full_messages
    end
  end

private
  def order_processing_params
    params.require(:order).permit(:order_amount, :service_amount, :miners_amount, client_attributes: [:name, :email, :phone_number, :date])
  end

  def find_client
    @client = Client.find_or_create_by(email: params[:order][:client_attributes][:email])
    #below line can be improved using a method, see the last line if later you want, never update a primary key which is email in bulk params
    @client.update_attributes(name: params[:order][:client_attributes][:name], phone_number: params[:order][:client_attributes][:phone_number], date: params[:order][:client_attributes][:date])
  end

  #def get_client_params
   # params.require(:order)
  #end
end
...