8
class Api::StoresController < ApplicationController  
  respond_to :json

  def index
    @stores = Store.all(:include => :products)
    respond_with @stores
  end
end

商品のない店舗のみを返品します。

Store.find(:all).to_json(:include => :products)

関連付けがテストされています。たとえば、コンソール出力でネストされた製品を確認できます。

Store.first.products

それらの製品をMongoMapperに含める正しい方法は何ですか?

これが私のモデルです:

   class Store
     include MongoMapper::Document         
     many :products, :foreign_key => :store_ids 
   end

   class Product
     include MongoMapper::Document         
     key :store_ids, Array, :typecast => 'ObjectId'
     many :stores, :in => :store_ids
   end

アップデート

スコットの提案を試す際に、ストアモデルに次のものを追加しました。

def self.all_including_nested
  stores = []
  Store.all.each do |store|
    stores << store.to_hash
  end
end

def to_hash
  keys = self.key_names
  hash = {}
  keys.each{|k| hash[k] = self[k]}
  hash[:products] = self.products
  hash[:services] = self.services
  hash
end

そしてコントローラーで:

def index
  @stores = Store.all_including_nested
  respond_with @stores
end

どちらが機能するように見えますか?ハッシュの配列に#to_jsonが呼び出されると仮定すると、各ハッシュと各Product+Serviceにも同じことが起こります。私はActiveSupport::JSONのソースを読んでいますが、これまでのところ、それを利用しています。

しかし、まだ機能していません... :(

4

2 に答える 2

17

メソッドをご覧くださいas_json()。これをモデルに入れ、json を定義したら、render :jsonメソッドを呼び出すだけで、必要なものを取得できます。

class Something
  def as_json(options={})
    {:account_name       => self.account_name,
     :expires_on         => self.expires_on.to_s,
     :collections        => self.collections,
     :type               => "Institution"}
  end
end

self.collectionsどちらが多関係であるかがわかります。そのモデルは次のようにもas_json()定義されています。

class Collection
  def as_json(options={})
    {:name          => self.name,
     :title         => self.title,
     :isbn          => self.isbn,
     :publisher     => self.publisher,
     :monthly_views => self.monthly_views}
  end
end

self.monthly_viewsこれには、別の多くの関係を表すものが含まれています。

次に、コントローラーで:

@somethings = Something.all
render :json => @somethings
于 2011-02-25T19:01:59.210 に答える
2

独自のメソッドを作成してハッシュを生成し、ハッシュを JSON に変換する必要がある場合があります。私はこのようなことを考えています:

store = Store.first
keys = store.key_names
hash = {}
keys.each{|k| hash[k] = store[k]}
hash[:products] = store.products
hash.to_json
于 2011-02-25T03:11:57.530 に答える