Non persistent ActiveRecord model attributes

Viewed 23785

I want to add to an existing model some attributes that need not be persisted, or even mapped to a database column. Is there a solution to specify such thing ?

5 Answers

I was having the same problem but I needed to bootstrap the model, so the attribute had to persist after to_json was called. You need to do one extra thing for this.

As stated by apneadiving, the easiest way to start is to go to your model and add:

attr_accessor :foo

Then you can assign the attributes you want. But to make the attribute stick you need to change the attributes method. In your model file add this method:

def attributes
  super.merge('foo' => self.foo)
end

From Rails 5.0 onwards you could use attribute:

class StoreListing < ActiveRecord::Base
  attribute :non_persisted
  attribute :non_persisted_complex, :integer, default: -1
end

With attribute the attribute will be created just like the ones being persisted, i.e. you can define the type and other options, use it with the create method, etc.

If your DB table contains a matching column it will be persisted because attribute is also used to affect conversion to/from SQL for existing columns.

see: https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute

Related