File: identity.rb

package info (click to toggle)
mikutter 5.1.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,780 kB
  • sloc: ruby: 22,912; sh: 186; makefile: 21
file content (66 lines) | stat: -rw-r--r-- 1,886 bytes parent folder | download | duplicates (3)
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