Anotando en Rails: models, tests, fixtures, factories, routes

Algunas veces se desea mostrar en cada modelo, test, fixture, factory los campos que se encuentran definidos y sus formatos (información también disponible en schema.rb) esto va muy de la mano del gusto y cultura de cada desarrollador o equipo de trabajo, para los casos en que se desea ser explícito se puede utilizar la gema Annotate la cual podemos instalar con un simple gem install annotate o requerirla en nuestro Gemfile en el ambiente de desarrollo con:

1
2
3
group :development do
gem 'annotate'
end

La gema por defecto instala una herramienta de línea de comandos que podemos llamar dentro de la ruta de nuestra app Rails con annotate la cual por defecto agregará a todos los modelos, tests, fixtures, factories, al inicio comentarios con todos los campos del modelo.

Acá vemos un antes del modelo user.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
class User < ActiveRecord::Base
enum role: [:user, :vip, :admin]
after_initialize :set_default_role, if: :new_record?

def set_default_role
self.role ||= :user
end

# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :invitable, :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable
end

Y luego de correr annotate en la terminal, vemos lo que sucede:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# == Schema Information
#
# Table name: users
#
# id :integer not null, primary key
# email :string default(""), not null
# encrypted_password :string default("")
# reset_password_token :string
# reset_password_sent_at :datetime
# remember_created_at :datetime
# sign_in_count :integer default("0"), not null
# current_sign_in_at :datetime
# last_sign_in_at :datetime
# current_sign_in_ip :string
# last_sign_in_ip :string
# created_at :datetime
# updated_at :datetime
# name :string
# confirmation_token :string
# confirmed_at :datetime
# confirmation_sent_at :datetime
# unconfirmed_email :string
# role :integer
# invitation_token :string
# invitation_created_at :datetime
# invitation_sent_at :datetime
# invitation_accepted_at :datetime
# invitation_limit :integer
# invited_by_id :integer
# invited_by_type :string
# invitations_count :integer default("0")
#
# Indexes
#
# index_users_on_email (email) UNIQUE
# index_users_on_invitation_token (invitation_token) UNIQUE
# index_users_on_invitations_count (invitations_count)
# index_users_on_invited_by_id (invited_by_id)
# index_users_on_reset_password_token (reset_password_token) UNIQUE
#

class User < ActiveRecord::Base
enum role: [:user, :vip, :admin]
after_initialize :set_default_role, if: :new_record?

def set_default_role
self.role ||= :user
end

# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :invitable, :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable
end

También para que este proceso no sea manual, se puede correr el generador de la gema:

1
rails g annotate:install

Con lo cual, cada vez que se realice una migración la gema anotará los diferentes archivos en base a los últimos cambios automáticamente (esto por defecto lo hace en ambiente de desarrollo únicamente).

Hay que explorar la gema pues tiene otras opciones, al final su uso o no es una decisión de forma de trabajo, sino siempre contamos con schema.rb

Hasta la próxima!

avatar

Blog neyDroid

Desarrollando Vagancias