ArrayEnum gem for PostgreSQL array columns


If you are familiar with Rails Enum module, where values are mapped to integers (or native enum type) in database, you might wonder if a similar approach is available for array columns.

With a little help from the simple array_enum gem, it is now possible.

Having an integer column defined as PostgreSQL array one can assign and read string values, that internally will be stored as integers in database.

class Profile < ActiveRecord::Base
  extend ArrayEnum

  array_enum goals: {"get_fit" => 1, "gain_muscle" => 2, "lose_weight" => 3}

profile = Profile.create(goals: ["lose_weight", "gain_muscle"])
profile.goals # => ["lose_weight", "gain_muscle"]

To simplify querying array columns, a handy scope will be generated as well

# => returns users having any of their goals values being "gain_muscle"

that under the hood is making SQL query like WHERE (goals @> ARRAY[2]).


To simplify validating array attribute values, subset validator is included in the gem.

class CreateProfile
  include ActiveModel::Model

  attr_accessor :goals

  validates :goals, subset: ["get_fit", "gain_muscle", "lose_weight"]
end ["sit_on_couch_and_watch_tv"]).valid? # => false