Hello, I used MongoDB before PostreSQL with an ODM called MongoEngine, which has a method for retrieving single results from the DB. It is similar to ActiveRecord find_by! as it raises an exception if no matching records are found. The difference is, it also raises an exception if more than one record matched the query. I've been looking for a similar feature in ActiveRecord but haven't found any so far.
I'm currently using the following workaround, which works with chained where methods, def ensure_unique # Ensures an Active Record query returns a *single* record, or raise exception # Usage: MyModel.where(foo: 'bar').where(baz: 'qux).ensure_unique if self.many? raise ActiveRecord::RecordNotUnique, 'More than one record matched criteria. A single match was expected.' elsif self.empty? raise ActiveRecord::RecordNotFound, 'No matching records were found. A single match was expected.' else # The where method always returns a collection, even when only one record is found. # We want to return a single item. return self.first end end It could also be implemented as a query method (such as find_by!). However, I'd have to look further into it and find a way to support queries involving "AND" logic, such as chaining multiple where methods. def find_unique_by!(*args) # Ensures an Active Record query returns a *single* record, or raise exception # Usage: MyModel.find_unique_by(foo: 'bar') result = where(*args) if result.many? raise ActiveRecord::RecordNotUnique, 'More than one record matched criteria. A single match was expected.' elsif result.empty? raise ActiveRecord::RecordNotFound, 'No matching records were found. A single match was expected.' else return result.first end end I'm wondering if the core team would approve the implementation of such feature. If positive, I would gladly write and commit it. Best Regards, Bruno Facca -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-core+unsubscr...@googlegroups.com. To post to this group, send email to rubyonrails-core@googlegroups.com. Visit this group at https://groups.google.com/group/rubyonrails-core. For more options, visit https://groups.google.com/d/optout.