Is there a way to make Rails ActiveRecord attributes private?

Leonid Shevtsov picture Leonid Shevtsov · Sep 22, 2010 · Viewed 11.9k times · Source

By default, ActiveRecord takes all fields from the corresponding database table and creates public attributes for all of them.

I think that it's reasonable not to make all attributes in a model public. Even more, exposing attributes that are meant for internal use clutters the model's interface and violates the encapsulation principle.

So, is there a way to make some of the attributes literally private?

Or, maybe I should move on to some other ORM?

Answer

Matt Briggs picture Matt Briggs · Sep 22, 2010

Jordini was most of the way there

Most of active_record happens in method_missing. If you define the method up front, it won't hit method_missing for that method, and use yours instead (effectively overwriting, but not really)

class YourModel < ActiveRecord::Base

  private

  def my_private_attribute
    self[:my_private_attribute]
  end

  def my_private_attribute=(val)
    write_attribute :my_private_attribute, val
  end

end