読者です 読者をやめる 読者になる 読者になる

DataMapperでdefault_scope的なことをする

Ruby

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名がわからないと変換できないからです.