Skip to content
/ ar-uuid Public

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

License

MIT, MIT licenses found

Licenses found

MIT
LICENSE.md
MIT
LICENSE.txt
Notifications You must be signed in to change notification settings

fnando/ar-uuid

ar-uuid

Tests 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.

About

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

Topics

Resources

License

MIT, MIT licenses found

Licenses found

MIT
LICENSE.md
MIT
LICENSE.txt

Code of conduct

Stars

Watchers

Forks

Packages

No packages published