DataMapperでdefault_scope的なことをする
LokkaがDataMapperなのでしかたなく使ってるわけですが,正直DMはあんまりいいライブラリではありません.
ActiveRecordと迷っているなら間違いなくActiveRecordを使うべきです.
で,DataMapperにはActiveRecordでのdefault_scopeにあたるものがありません.
正確にはdefault_scopeというメソッドはありますがprivate APIですし,あなたの期待する動作はしないでしょう.
default_orderを使う
default_scopeで設定したかったものがorderの場合はdefault_orderで代替できます.
class MyModel include DataMapper::Resource default_order 'created_at DESC' end ||<</del> 追記:ダメっぽい. default_scopeは他の用途で使うらしいので ↓の方法でやりましょう.orderだけならgetのことは関係ないので安心 **firstとallを上書きする 強引な方法としてfirstとallを上書きしてしまう手があります. 例えば :draft => false というscopeを付加したい場合,以下の様にします. >|ruby| class << self def _default_scope {:draft => false} end def first_with_scope(limit, query = DataMapper::Undefined) unless limit.kind_of? Integer query = limit limit = 1 end query = _default_scope.update(query) if query.kind_of? Hash query = _default_scope if query == DataMapper::Undefined first_without_scope query end alias_method_chain :first, :scope def all_with_scope(query = DataMapper::Undefined) query = _default_scope.update(query) if query.kind_of? Hash query = _default_scope if query == DataMapper::Undefined all_without_scope query end alias_method_chain :all, :scope end def self.unscoped klass = self.clone class << klass alias_method :first, :first_without_scope alias_method :all, :all_without_scope end klass end
問題点
この方法ではgetではscopeが作用しません.
getにscopeを付加するにはfirstに変換して考える必要がありますが
PrimaryKeyのcolumn名がわからないと変換できないからです.