2011-12-20 9 views
1

私は 'hasMany' ModelBインスタンスを持つことができるModelAのインスタンスを持っているとします。すでにサーバー上に存在するModelBレコードのIDを与えられた場合、モデルAをモデルBに関連付けるにはどうすればよいですか? (APIドキュメントでは、新しいモデルBのインスタンスとデータベースレコードを同時に作成することによってこれを行う方法のみを示しています)。ExtJS 4:モデルを別の既存のモデルとIDで関連付ける方法はありますか?

例として、PersonオブジェクトとMeetingオブジェクトとのスケジュールミーティングに使用できるアプリがあります。サーバーは、会議のために、このようにJSONを返すことがあります:

会議:

{ 
    id: '10', 
    purpose: 'Code review', 
    time: <timestamp>, 
    attendees: [ 501, 532 ] 
} 

人:私は理解して

Ext.define('Person', { 
    extend: 'Ext.data.Model', 
    fields: ['id', 'name', 'email'], 
    proxy: { 
     type: 'rest', 
     url : 'data/people', 
     reader: { type: 'json' } 
    } 
}); 

Ext.define('Meeting', { 
    extend: 'Ext.data.Model', 
    fields: ['id', 'purpose', 'time'], 
    hasMany: { model: 'Person', name: 'attendees' } 
    proxy: { 
     type: 'rest', 
     url : 'data/meetings', 
     reader: { type: 'json' } 
    } 
}); 

{ id: 501, name: 'Kermit', email: '[email protected]' } 

モデルは次のように定義される可能性がありますかつて会議がロードされていること。私はmeeting.attendees()を呼び出して各Personモデルにアクセスできます。ただし、新しい出席者ID(たとえば599)があれば、別の人をどのように会議に追加できますか? id 599のPersonインスタンスをロードし、そのインスタンスを '出席者'に追加する唯一のオプションですか?

Meeting.load(10, { 
    success: function(meeting) { 

     Person.load(599, { 
      success: function(person) { 
       meeting.attendees().add(person); 
       meeting.save(); 
      } 
     }); 

    } 
}) 

meeting.save()を実行すると、POSTには人のIDだけが正確に含まれますか?

{ 
    id: '10', 
    purpose: 'Code review', 
    time: <timestamp>, 
    attendees: [ 501, 532, 599 ] <-- '599' is new attendee 
} 

ありがとうございます!

+0

多くのミーティングに出席でき、ミーティングには多くの人が参加できるため、多対多の関係を使用しているはずです。 IDのリスト、配列などは悪いことです。 – rwilliams

+0

ありがとうございました。つまり、これは単純な類推に過ぎませんでした。実際には、アソシエーションは本当に1対多数であり、データベース(MongoDB)の好ましいアプローチではIDの配列を使用しています。しかし、要点。 –

+1

ここでは、EXT JS 4の文書データベースの処理を改善するために行われた作業についての記事を掲載します。 http://www.sencha.com/forum/showthread.php?127547-Sencha-Platform-denormalized-Data-patch CouchDBでSencha Touchのパッチを適用したバージョンを使用しています。 – rwilliams

答えて

0

正直言って...関連付けは読書に最も適しています。関連するモデルを編集することは、ライターなどを構成する方法がないため、最良ではありません。 UIでは、はい、出席者()から取得したストアに新しいモデルを追加しますが、そのモデルをサーバーにも戻す必要があります。

+0

会議が保存されると、出席者()のために何も返されません。 –

+1

Meetingモデルにattendeesというフィールドを追加し、手動でアレイの更新を処理しない限り、修正します。 ExtJSは非正規化データを非常にうまく処理しません。標準的な正規化データベース構造が必要です。 – rwilliams

+0

@rwilliamsありがとう! –

関連する問題