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 に書いておくといいと思う。