Override migration methods to support UUID columns without having to be explicit about it.
Override migration methods to support UUID columns without having to be explicit about it.
gem install ar-uuid
Or add the following line to your project's Gemfile:
gem "ar-uuid"
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
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
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
.
For more details about how to contribute, please read https://github.com/fnando/ar-uuid/blob/main/CONTRIBUTING.md.
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.
Everyone interacting in the ar-uuid project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.