Takazudo hamalog

programming notes. mainly about JavaScript / jQuery. [@Takazudo] [takazudo@gmail.com] Hint: alt + /

cool guy

Spine - Modelの使い方

2012/02/16 permalink

Spine のModelとやらを試した

class Person extends Spine.Model
  
  # must run configure first.
  # first arg is Class name. then specify instance members
  @configure 'TestModel', 'first_name', 'last_name'

  constructor: ->
    super # invoke Spine.Model's constructor
    console.log 'person instance was created', arguments

  # your method
  fullName: -> "#{@first_name} #{@last_name}"
  
# create Person instances
person_a = new Person( first_name: 'Takeshi', last_name: 'Takatsudo' )
person_b = new Person( first_name: 'Taro', last_name: 'Yamada' )
person_c = new Person( first_name: 'Hanako', last_name: 'Yamada' )

# fire instance method
console.log person_a.fullName() # 'Takeshi Takatsudo'

# Model has events.
person_a.bind 'customevent', ->
  console.log 'yey!'
person_a.trigger 'customevent' # yey!

# save them to Model.
person_a.save()
person_b.save()
person_c.save()

# each instances has its own id
console.log person_a.id # c-0
console.log person_b.id # c-1
console.log person_c.id # c-2

# Now you can handle these records with Person Model
# { 'c-0': person_a, 'c-1': person_b, 'c-2': person_c, }
console.log Person.records

# get all cloned copy
console.log Person.all() # [person_a, person_b, person_c]

# toJSON
console.log Person.toJSON() # dump as JSON

# find
console.log (Person.find 'c-1').fullName() # Taro Yamada
console.log (Person.findByAttribute 'first_name', 'Takeshi') # person_a
console.log (Person.findAllByAttribute 'last_name', 'Yamada') # [person_b, person_c]

# each
Person.each (person) ->
  console.log person.fullName()

# count
console.log Person.count() # 3

# destroyAll.
# deleteAll also works. destroyAll fires 'destroy' event
Person.destroyAll()
console.log Person.count() # 0

Backbone.jsだと、いわゆる「モデル」と呼ばれるクラスは、ModelとCollectionに分けられ、オブジェクトをラップするのがModelで、これを集めたものをCollectionにまとめるという形になっていた。Collectionが、Modelのインスタンスを、自身のメンバの配列の中に持つ感じ。よって、Backbone.jsを使う場合、ModelとCollectionのインスタンスで階層構造を作るような感じになる。(と思う自分の理解が正しければ)

これに対し、Spineでは、ひとつのModelが、Backbone.jsで言うModelとCollection両方の役割を持つ。Spine.Modelを継承したクラスは、それ自身がBackbone.jsで言うCollectionのインスタンスであり、Modelのクラスである - 具体的には、上記コードだと、クラス Person 自身にインスタンスを保存する配列 - Person.records初めから生えており、この中に、Personのインスタンスを保存することの出来る設計になってた。Personクラスへのレコード保存は、Personインスタンスのsaveメソッドを呼ぶことで実行される。このため、別途管理したいPersonの集合を作りたければ、Personを継承した別のクラスを作り、そのクラスを、Backbone.jsのCollectionのインスタンスのように使うことになる - たぶん… - というのに気付くのにさっぱり時間がかかった。サーバーのプログラムやってる人ならけっこう当たり前の話なのかもしれんけど。

blog comments powered by Disqus

  1. atm09tdhamalogからリブログしました
  2. hamalogの投稿です