AR update / create pattern: is there an easier way?

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

On 4 January 2012 20:25, Fearless F. [email protected] wrote:

I find myself writing the following frequently:

r = MyActiveRecord.where(:attr1 => cond1, :attr2 => cond2, …)
r.exists? ? r.first : r.create

You want to look at the create_or_update_by_id and
find_or_initialize_by_id methods :slight_smile: