1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
# -*- coding: utf-8 -*-
=begin rdoc
Diva::Modelにこのmixinをincludeすると、findbyid()によってそのIDをもつインスタンスを得ることができる。
利用するclassは、idメソッドを実装している必要がある。
=end
require 'memoist'
module Diva::Model::Identity
extend Memoist
module IdentityExtend
# データソースを返す。
# findbyidは、このデータソースに対して行われる
def memory
@memory ||= Diva::Model::Memory.new(self) end
# idキーが _id_ のインスタンスを返す。
# ==== Args
# [id] Integer|Enumerable 検索するIDか、IDを列挙するEnumerable
# ==== Return
# 次のいずれか
# [nil] その条件で見つけられなかった場合
# [Diva] 見つかった場合
# [Enumerable] _id_ にEnumerableを渡した場合。列挙される順番は、 _id_ の順番どおり。
def findbyid(id, policy=Diva::DataSource::USE_ALL)
memory.findbyid(id, policy) end
# :nodoc:
def generate(args, policy=Diva::DataSource::USE_ALL)
case args
when Hash
result = self.findbyid(args[:id], policy)
return result.merge(args) if result
super(args)
when Retriever::Model
args
else
self.findbyid(args, policy)
end
end
# :nodoc:
def new_ifnecessary(hash)
type_strict hash => tcor(self, Hash)
result_strict(self) do
if hash.is_a?(self)
hash
elsif hash[:id] and hash[:id] != 0
memory.findbyid(hash[:id].to_i, Diva::DataSource::USE_LOCAL_ONLY) or super
else
super end end end
# :nodoc:
def store_datum(datum)
memory.store_datum(datum) end
end
def self.included(klass)
klass.extend(IdentityExtend)
end
memoize def hash
self.id.hash ^ self.class.hash end
end
|