Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/fnando/ar-uuid

Override migration methods to support UUID columns without having to be explicit about it.
https://github.com/fnando/ar-uuid

activerecord postgres postgresql primary-key rails uuid

Last synced: 27 days ago
JSON representation

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

Awesome Lists containing this project

README

        

# ar-uuid

[![Tests](https://github.com/fnando/ar-uuid/workflows/ruby-tests/badge.svg)](https://github.com/fnando/ar-uuid)
[![Gem](https://img.shields.io/gem/v/ar-uuid.svg)](https://rubygems.org/gems/ar-uuid)
[![Gem](https://img.shields.io/gem/dt/ar-uuid.svg)](https://rubygems.org/gems/ar-uuid)

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

## Installation

```bash
gem install ar-uuid
```

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

```ruby
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.

```ruby
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.

```ruby
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](https://api.rubyonrails.org/classes/ActiveRecord/ModelSchema.html#method-c-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:

```ruby
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:

```ruby
# 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](https://github.com/rails/rails/blob/f52354ad1d15120dcc5284714bee7ee3f052986c/activerecord/lib/active_record/relation/finder_methods.rb#L104),
which will use the order implemented by the database.

There's no alternative to `.last`.

## Maintainer

- [Nando Vieira](https://github.com/fnando)

## Contributors

- https://github.com/fnando/ar-uuid/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](https://opensource.org/licenses/MIT). 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](https://github.com/fnando/ar-uuid/blob/main/CODE_OF_CONDUCT.md).