2016-01-29 6 views
0

У меня есть следующий контроллер:Rails 4 - Простой включать несколько JSON в другой формат JSON

# orders_controller.rb 

    def update_quantity 
    @product = Product.by_id(params[:product_id]) 
    @product_details = ProductDetail.availables.by_id(params[:product_id]) 

    respond_to do |format| 
     format.json { render :json => @product.to_json({ :include => [ :current_price, :product_details ] }) } 
    end 
    end 

Я просто хочу вернуть JSON с данными продукта, включая их текущую цену и products_details, но только доступные детали (Inventory).

Продукты и current_price работают хорошо, но если я использую: product_details, рельсы включают ВСЕ детали, и я хочу, чтобы содержалась внутри переменной @product_details.

Thanks

ответ

1

Я не уверен, что я понимаю ваш вопрос. Если product_details не работает, попробуйте следующее:

def update_quantity 
    @product = Product.by_id(params[:product_id]) 

    respond_to do |format| 
    format.json { 
     render :json => @product.to_json( 
     { 
      :include => [ :current_price ], 
      :methods => [ :product_details ] 
     } 
    ) 
    } 
    end 
end 

В вашей Product модели добавить:

def product_details 
    ProductDetail.availables.by_id(self.id) 
end 

Если вы хотите только некоторые поля product_details:

respond_to do |format| 
    format.json { 
    render :json => @product.to_json( 
     { 
     :include => [ 
      :current_price, 
      product_details: { 
      only: [ 
       :field1, 
       :field2 
      ] 
      } 
     ] 
     } 
    ) 
    } 
end 
+0

отлично работает !!!! TYVM –

1

Кажется, что там - это метод product_details в вашем классе Product, который возвращает каждую запись ProductDetail, связанную с вашим @product. Скорее всего, это связано с ActiveRecord association methods при создании ассоциаций между моделями. Например, has_many :product_details создает метод Product#product_details, поэтому при сериализации экземпляра продукта вы также сериализуете product_details.

Вам нужно будет создать метод, который возвращает подмножество записей на основе ваших требований. Например:

class Product 
    has_many :product_details 

    def available_product_details 
    product_details.available 
    end 
end 

Теперь вы можете обновить ваш контроллер выглядеть следующим образом:

OrdersController < ApplicationController 
def update_quantity 
    @product = Product.by_id(params[:product_id])  
    respond_to do |format| 
     format.json do 
     render json: @product.to_json(include: [:current_price, :available_product_details]) 
     end 
    end 
    end 
end 
Смежные вопросы