使い方
逆参照時の取り扱い
includeInJSON
の挙動をようやく把握したのでメモ(あんまり興味なかった)。こんな感じ。
class AlbumModel extends Backbone.RelationalModel
@
class PhotoModel extends Backbone.RelationalModel
relations: [
{
# PhotoModelとAlbumModelの関係をが 1:N とする
type: Backbone.HasOne
relatedModel: AlbumModel
# photoModel.get('album') でAlbumModelを取得
key: 'album'
# albumModelからどう見えるか
reverseRelation:
# albumModel.get('photos') としてPhotoModelを取得
key: 'photos'
# albumModel.get('photos') として取得した場合に含めるのはidのみ
includeInJSON: ['id']
}
]
# e.g.
album = new AlbumModel(id: 1)
album.fetch()
# snip
photos = album.get('photos')
photo = photos[0]
photo.attributes
###
{
id: 123
}
###
トラブルシュート
連携先のコレクションが常にBackbone.Collectionになる
例えばこんなふうに、2つのファイルに分かれている。
class Photo extends Backbone.RelationalModel
idAttribute: 'id'
urlRoot: '/ajax/photos/'
class PhotoCollection extends Backbone.Collection
model: Photo
album.coffee
class Album extends Backbone.RelationalModel
idAttribute: 'id'
urlRoot: '/ajax/albums/'
relations: [
{
type: Backbone.HasMany,
key: 'photos',
relatedModel: Photo,
collectionType: PhotoCollection
}
]
Album
を初期化してphotos
を取り出すと、collectionがBackbone.Collection
になった。
view.coffee
album = new Album(id: 1)
collection = album.get('photos') # これがBackbone.Collectionになる!
album.coffee
内でPhotoCollection
が参照できないためBackbone.Collection
が返る。Collectionオブジェクトが返ってくるので一見普通に動いているように見えてしまうのがクセモノ。色々調べた結果、album.coffee
でphoto.coffee
をrequireしていないのが原因だった。ショボイ。