I find myself writing the following frequently:
r = MyActiveRecord.where(:attr1 => cond1, :attr2 => cond2, ...) r.exists? ? r.first : r.create
... which has the effect of returning an instance of MyActiveRecord if all the conditions are met, or creating one if it doesn't. A variant of this:
c = MyActiveRecord.new(:attr1 => val1, :attr2 => val2, ...) r = MyActiveRecord.where(:attr1 => c.attr1, :attr2 => c.attr2, ...) c.save! unless r.exists?
... which has the effect of writing c to the db only if it is unique across the given attributes.
Question: Do either of these forms replicate functionality already provided by ActiveRecord? (I know about the find_or_create dynamic methods, but those get unwieldy with more than two attributes.) Is there a cleaner or more idiomatic way?
- ff