2012-01-02 8 views
1

Datamaのクラスで関連付けを定義すると、デフォルトで関連するモデルデータを取得していないようです。一例として、DataMapper(Ruby)で関連モデルをフェッチする

class Song 
    include DataMapper::Resource 

    property :id,   Serial 
    property :name,   String 
    property :artist_id, Integer 

    belongs_to :artist 
end 

class Artist 
    include DataMapper::Resource 

    property :id,  Serial 
    property :name,  String 

    has n, :songs 
end 

Song.get(params[:id]).to_json 

曲のクエリは、デフォルトでは、アーティストのテーブルと結合を実行しません。上記の例では、歌を歌手と共に一緒に演奏していますか?いずれかのクラスを個別にクエリすると問題なく動作します。これはDataMapperを使用して作成されたものではないことに注意してください。

ありがとうございます!

答えて

2

あなたがしようとしていることは、現在できていないと思われます。 DataMapperを使用すると、曲のアーティストのようなプロパティをいつでも簡単に読み込むことができ、hereと記載されている戦略的な熱意のある読み込みを使用することさえできます。しかし、既にプロパティがロードされていても、それはto_jsonによって返された結果には含まれません。

だからは二つの選択肢が残されています。あなたは、単にハッシュを構成し、それにto_jsonを使用するために、いくつかの追加のコーディングを行うことができます

song = Song.get(params[:id]) 
json = song.attributes.merge({:artist => song.artist.attributes}).to_json 
  1. あなたは含めることができますSongクラス自体の同様のコード:
def to_json 
    self.attributes.merge({:time_zone => self.time_zone.attributes}).to_json 
end 

#2で作業する場合は、require 'json'も必要です。

DataMapperがto_jsonを再帰的に動作させることはお勧めできません。そうしないと、データベース全体が返されることになります。P

関連する問題