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 BatchGetItem.
-
#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.
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/dynamoid/finders.rb', line 209 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 44 45 46 47 48 49 50 51 52 53 |
# 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, ) if result.nil? = "Couldn't find #{self.name} with '#{self.hash_key}'=#{ids[0]}" raise Errors::RecordNotFound.new() end expects_array ? Array(result) : result else result = find_all(ids) if result.size != ids.size = "Couldn't find all #{self.name.pluralize} with '#{self.hash_key}': (#{ids.join(', ')}) " << "(found #{result.size} results, but was looking for #{ids.size})" raise Errors::RecordNotFound.new() end result 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 BatchGetItem. Returns empty array if no results found.
Uses backoff specified by ‘Dynamoid::Config.backoff` config option
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/dynamoid/finders.rb', line 69 def find_all(ids, = {}) results = unless Dynamoid.config.backoff items = Dynamoid.adapter.read(self.table_name, ids, ) items ? items[self.table_name] : [] else items = [] backoff = nil Dynamoid.adapter.read(self.table_name, ids, ) do |hash, has_unprocessed_items| items += hash[self.table_name] if has_unprocessed_items backoff ||= Dynamoid.config.build_backoff backoff.call else backoff = nil end end items end results ? results.map {|i| from_database(i) } : [] end |
#find_all_by_composite_key(hash_key, options = {}) ⇒ Array
Find all objects by hash and range keys.
137 138 139 140 141 |
# File 'lib/dynamoid/finders.rb', line 137 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
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/dynamoid/finders.rb', line 163 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
112 113 114 |
# File 'lib/dynamoid/finders.rb', line 112 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.
99 100 101 102 103 104 105 |
# File 'lib/dynamoid/finders.rb', line 99 def find_by_id(id, = {}) if item = Dynamoid.adapter.read(self.table_name, id, ) from_database(item) else nil end end |