CouchResource::View

ひさびさに自分欲求でCouchResourceを更新。View をモデルクラス内で定義できるようにした。

こんな感じ、mapしか定義していないけど、reduceもいける、と思う。

class SimpleDocument < CouchResource::Base
  self.database = "http://localhost:5984/#{TEST_DB_PATH}"
  string :title
  string :content

  view :simple_document, {
    :all_by_id => {
      :map => "function(doc){ emit(doc._id, doc); }"
    },
    :all_by_title => {
      :map => "function(doc){ emit(doc.title, doc); }"
    }
  }
end

# Return all documents via _design/simple_document/all_by_id
SimpleDocument.simple_document_all(:all_by_id)

# Return first document object via _design/simple_document/all_by_id
SimpleDocument.simple_document_first(:all_by_id)

# Return last document via _design/simple_document/all_by_title?descending=true
SimpleDocument.simple_document_last(:all_by_titile)

# Return last document via _design/simple_document/all_by_title?descending=true&key="hogehoge"
SimpleDocument.simple_document_last(:all_by_titile, :key => "hogehoge")


view "デザイン名", ViewスクリプトのHash で定義がクラスインスタンス上(read/write_inheritable_attribtue(:design_documents) 上)に行われるのと同時に、"デザイン名"_[all|first|last] のメソッドを定義する。このメソッドは第1引数にviewの名前、第2引数に、QueryString のkey/value値をhashで記述可能。

で、モデルクラス.デザイン名_[all|first|last] メソッドが呼ばれるときは、デザインドキュメントがなければDB上に定義する。モデルクラスのクラス定義がロードされてから一度しかチェックをしないが、test時などDBを丸ごと消してしまうような場合に備えて、毎回デザインドキュメントの定義をチェックさせることもできる。どこかで、

CouchResource::Base.check_view_every_access = true

のように定義しておけばOK。デフォルトは false (というかnil) なので environments.rb か environment/test.rb に書いておくといいと思う。