lib/architect4r/model/queries.rb in architect4r-0.4.2 vs lib/architect4r/model/queries.rb in architect4r-0.4.3

- old
+ new

@@ -14,18 +14,36 @@ data['data'].flatten.first end # Fetch a record of the specified model based on its id # - def find(id) - data = connection.execute_cypher("start s=node(#{self.model_root.id}), d=node(#{id.to_i}) match s<-[r:model_type]-d return d") - data &&= data['data'] && data['data'].flatten.first - self.build_from_database(data) + def find(*ids) + # This code is taken from / inspired by activerecord: + # activerecord/lib/active_record/base.rb, line 1589 + expects_array = ids.first.kind_of?(Array) + return ids.first if expects_array && ids.first.empty? + + ids = ids.flatten.compact.uniq + + case ids.size + when 0 + raise(Architect4r::RecordNotFound.new("Could not find the #{self.name} without an id!")) + when 1 + id = ids.first.to_i + data = connection.execute_cypher("start s=node(#{self.model_root.id}), d=node(#{id}) match s<-[r:model_type]-d return d") + data &&= data['data'] && data['data'].flatten.first + result = self.build_from_database(data) + + expects_array ? [ result ] : result + else + ids = ids.map { |i| i.to_i }.uniq.join(',') + find_by_cypher("start s=node(#{self.model_root.id}), d=node(#{ids}) match s<-[r:model_type]-d return d", 'd') + end end alias :find_by_id :find def find!(id) - self.find_by_id(id) || raise(Architect4r::RecordNotFound.new("Could not find the #{self.name} with id #{id}!")) + self.find(id) || raise(Architect4r::RecordNotFound.new("Could not find the #{self.name} with id #{id}!")) end alias :find_by_id! :find! # Use this method only to fetch items of the same class. def find_by_cypher(query, identifier) \ No newline at end of file