ar-uuid

Tests Code Climate Gem Gem

Override migration methods to support UUID columns without having to be explicit about it.

Installation

gem install ar-uuid

Or add the following line to your project's Gemfile:

gem "ar-uuid"

Usage

There's no setup. Just adding the gem to your Gemfile is enough. When you create a new table, the id column will be defined as uuid. This is also true for references.

create_table :users
add_reference :posts, :users

create_table :posts do |t|
  t.belongs_to :user
  # or
  t.references :user
end

If you need a serial column, AR's PostgreSQL supports the bigserial column type.

create_table :users do |t|
  t.column :position, :bigserial, null: false
end

Sorting

Rails 6.0 or newer

If you're using Rails 6.0 or newer, you can set a default sorting with ActiveRecord::ModelSchema.implicit_order_column, so methods like ActiveRecord::FinderMethods::InstanceMethods#first and ActiveRecord::FinderMethods::InstanceMethods#last will work transparently, as long as you define another column for sorting, such as created_at (you may need to add an index).

The following example sets a default behavior to always sort using created_at (when available). On your abstract model, add the following lines:

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  def self.inherited(child_class)
    super

    return unless child_class.columns.any? {|col| col.name == "created_at" }

    child_class.implicit_order_column ||= "created_at"
  end
end

Older Rails versions

For older Rails versions, you can't use methods like ActiveRecord::FinderMethods::InstanceMethods#first and ActiveRecord::FinderMethods::InstanceMethods#last, since they are scoped to the sequential id.

The easiest alternative is ordering results and calling first/last. You can either create a sequence, or use the created_at/updated_at columns:

# Get first record
User.order(created_at: :asc).first

# Get last record
User.order(created_at: :desc).first

# Use scopes
class User < ApplicationRecord
  scope :newer, -> { order(created_at: :desc) }
  scope :older, -> { order(created_at: :asc) }
end

User.older.first
User.newer.first

You can also replace .first with ActiveRecord::FinderMethods::InstanceMethods#take, which will use the order implemented by the database.

There's no alternative to .last.

Maintainer

Contributors

Contributing

For more details about how to contribute, please read https://github.com/fnando/ar-uuid/blob/main/CONTRIBUTING.md.

License

The gem is available as open source under the terms of the MIT License. A copy of the license can be found at https://github.com/fnando/ar-uuid/blob/main/LICENSE.md.

Code of Conduct

Everyone interacting in the ar-uuid project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.