Module: Dynamoid::Finders::ClassMethods
- Defined in:
- lib/dynamoid/finders.rb
Instance Method Summary collapse
-
#find(*ids) ⇒ Dynamoid::Document
Find one or many objects, specified by one id or an array of ids.
-
#find_all(ids, options = {}) ⇒ Object
Return objects found by the given array of ids, either hash keys, or hash/range key combinations using BatchGet.
-
#find_all_by_composite_key(hash_key, options = {}) ⇒ Array
Find all objects by hash and range keys.
-
#find_all_by_secondary_index(hash, options = {}) ⇒ Array
Find all objects by using local secondary or global secondary index.
-
#find_by_composite_key(hash_key, range_key, options = {}) ⇒ Object
Find one object directly by hash and range keys.
-
#find_by_id(id, options = {}) ⇒ Dynamoid::Document
Find one object directly by id.
-
#method_missing(method, *args) ⇒ Dynamoid::Document/Array
Find using exciting method_missing finders attributes.
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args) ⇒ Dynamoid::Document/Array
Find using exciting method_missing finders attributes. Uses criteria chains under the hood to accomplish this neatness.
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/dynamoid/finders.rb', line 179 def method_missing(method, *args) if method =~ /find/ finder = method.to_s.split('_by_').first attributes = method.to_s.split('_by_').last.split('_and_') chain = Dynamoid::Criteria::Chain.new(self) chain.query = Hash.new.tap {|h| attributes.each_with_index {|attr, index| h[attr.to_sym] = args[index]}} if finder =~ /all/ return chain.all else return chain.first end else super end end |
Instance Method Details
#find(*ids) ⇒ Dynamoid::Document
Find one or many objects, specified by one id or an array of ids.
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/dynamoid/finders.rb', line 28 def find(*ids) = if ids.last.is_a? Hash ids.slice!(-1) else {} end expects_array = ids.first.kind_of?(Array) ids = Array(ids.flatten.uniq) if ids.count == 1 result = self.find_by_id(ids.first, ) expects_array ? Array(result) : result else find_all(ids) end end |
#find_all(ids, options = {}) ⇒ Object
Return objects found by the given array of ids, either hash keys, or hash/range key combinations using BatchGet. Returns empty array if no results found.
57 58 59 60 |
# File 'lib/dynamoid/finders.rb', line 57 def find_all(ids, = {}) items = Dynamoid.adapter.read(self.table_name, ids, ) items ? items[self.table_name].map{|i| from_database(i)} : [] end |
#find_all_by_composite_key(hash_key, options = {}) ⇒ Array
Find all objects by hash and range keys.
107 108 109 110 111 |
# File 'lib/dynamoid/finders.rb', line 107 def find_all_by_composite_key(hash_key, = {}) Dynamoid.adapter.query(self.table_name, .merge({hash_value: hash_key})).collect do |item| from_database(item) end end |
#find_all_by_secondary_index(hash, options = {}) ⇒ Array
Find all objects by using local secondary or global secondary index
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
# File 'lib/dynamoid/finders.rb', line 133 def find_all_by_secondary_index(hash, = {}) range = [:range] || {} hash_key_field, hash_key_value = hash.first range_key_field, range_key_value = range.first range_op_mapped = nil if range_key_field range_key_field = range_key_field.to_s range_key_op = "eq" if range_key_field.include?(".") range_key_field, range_key_op = range_key_field.split(".", 2) end range_op_mapped = RANGE_MAP.fetch(range_key_op) end # Find the index index = self.find_index(hash_key_field, range_key_field) raise Dynamoid::Errors::MissingIndex.new("attempted to find #{[hash_key_field, range_key_field]}") if index.nil? # query opts = { :hash_key => hash_key_field.to_s, :hash_value => hash_key_value, :index_name => index.name, } if range_key_field opts[:range_key] = range_key_field opts[range_op_mapped] = range_key_value end = opts.merge(.reject {|key, _| key == :range }) Dynamoid.adapter.query(self.table_name, ).map do |item| from_database(item) end end |
#find_by_composite_key(hash_key, range_key, options = {}) ⇒ Object
Find one object directly by hash and range keys
82 83 84 |
# File 'lib/dynamoid/finders.rb', line 82 def find_by_composite_key(hash_key, range_key, = {}) find_by_id(hash_key, .merge({:range_key => range_key})) end |
#find_by_id(id, options = {}) ⇒ Dynamoid::Document
Find one object directly by id.
69 70 71 72 73 74 75 |
# File 'lib/dynamoid/finders.rb', line 69 def find_by_id(id, = {}) if item = Dynamoid.adapter.read(self.table_name, id, ) from_database(item) else nil end end |