How to add a virtual attribute to a model in Ruby on Rails?

moorara picture moorara · Nov 16, 2015 · Viewed 31.8k times · Source

I'm working on a RubyonRails/ActiveAdmin application. My RoR version is 4.2.5 and AA version is 1.0.0. I have a model Message as follows.

class Message < ActiveRecord::Base

  belongs_to :user
  validates :user, :content, presence: true

  def palindrome
    # return true/false
  end

end

As you see, I want to have a read-only attribute palindrome which only depends on the content of message. I want this attribute to be treated exactly like a normal attribute. By normal, I mean when I retrieve messages via rails console or request json format of messages, I want to see a palindrome attribute in the list. I would also like to have a filter for message by this attribute.

I'm not sure how could I achieve this.

Answer

Brent Eicher picture Brent Eicher · Nov 16, 2015

Ruby actually lets you create virtual attributes this way, which keeps you from having to manually create getter and setter methods:

attr_reader   :palindrome #getter
attr_writer   :palindrome #setter
attr_accessor :palindrome #both

You can also pass multiple arguments too:

attr_accessor :palindrome, :foo, :bar

The documentation for it isn't the greatest.