0

Ruby on Rails で、JSON データが返されたとします。

render :json => array_of_purchases

この array_of_purchases には多数の Purchase オブジェクトが含まれており、それぞれにproduct_id. ここで、返された JSON にプロパティを追加して、各 Purchase オブジェクトにもその Product オブジェクト データが含まれるようにする場合は、次のようにします。

"product": { "id": 123, "name": "Chip Ahoy", image_file: "chip_ahoy.jpg", ... etc }

では、このコントローラー アクション内に新しいインスタンス変数を追加するにはどうすればよいでしょうか?

それは可能性があります

def get_data
  #  getting data ...
  class Purchase
    attr_accessor :product   # adding an instance variable
  end
  array_of_purchases.each {|p| p.product = Product.find(p.product_id)}
  render :json => array_of_purchases
end

ただし、このメソッド (コントローラー アクション) 内のクラスにインスタンス変数を追加しても機能しません。

更新:これは、1 つの注文に多くの購入があり、1 つの購入が製品と数量であると想定しています。(おそらく、一部のシステムはそれを注文明細と呼んでいますか?)

4

3 に答える 3

1

Purchasehas_manyだと思いProductsますか?

Rails には、ここで役立ついくつかのオプションがあります。to_json

class Purchase
  def to_json
    super :include => :products
  end
end

編集:あなたのモデルがどのように見えるかを投稿してもらえますか? あなたがやろうとしていることは正確には明らかではありません。

Ruby では、個々のオブジェクトのメソッドをオンザフライで定義できることを思い出してください。

def purchase.to_json
  super :include => :products
end
于 2010-08-19T02:12:12.473 に答える
1

Purchaseモデルにモデルへの関連付けがあると仮定しますProduct

class Purchase
  belongs_to :product
end

class Product
  has_many :purchases
end

render :json => array_of_purchases.to_json(:include => :product)

purchasesアレイの作成中に、このイーガー ローディング プロダクトをさらに最適化できます。

于 2010-08-19T08:39:16.963 に答える
0

Purchase クラスを想定しています。多分ActiveRecordモデル?

# in Controller

def show_full_display
  purchases = Purchase.find_all_by_customer_id(session.customer_id,
                 :include => :product)
  render :json => purchases.map{|p| p.full_display}.to_json  # convert to json
end

# in Purchase class
# fields include
#   id
#   customer_id
#   product_id
#        
belongs_to :product

def full_display
   # returns a hash for use by the full_display clients
   # Will be converted to JSON
   {"id" => id, "name" => product.name, "image_file" => product.image}
end

注: クラス Purchase の full_display メソッドは、ルビ ハッシュを返します。次にコントローラーは、ハッシュの配列をオブジェクトの JSON 配列に変換します。(Javascript はオブジェクトをハッシュとして使用します。)

full_display メソッドは、モデルではなくコントローラーにある可能性があります。より良いテストなどのためにモデルに入れました。それは「スキニーコントローラー、ファットモデル」のアイデアです。

于 2010-08-19T02:06:13.183 に答える