1.8: Asociaciones - wyeworks/rails-workshop-2017-dia-1 GitHub Wiki
Asociaciones
En esta parte vamos a hacer que un usuario vea y pueda manipular únicamente sus boards. Para lograr esto vamos a tener que asociar los boards a un usuario dado.
1. Asociar un usuario a varias cuentas
Generamos una migración para agregar a la tabla boards una foreign key a users.
$ rails generate migration AddUserToBoards user:references
Ese comando generará un archivo de migración similar a este:
class AddUserToBoards < ActiveRecord::Migration[5.0]
def change
add_reference :boards, :user, foreign_key: true
end
end
Corremos esa migración.
$ rails db:migrate
Declaramos la asociación en los modelos de Rails. Debemos usar has_many
en el modelo User y usar belongs_to
en el modelo Board.
# app/models/user.rb
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Agregamos está línea
has_many :boards, dependent: :destroy
end
# app/models/board.rb
class Board < ApplicationRecord
validates :name, presence: true
validates :visibility, inclusion: { in: %w(public private) }
# Agregamos esta línea
belongs_to :user
end
2. Mostrar únicamente los boards del usuario
En el listado de boards debemos mostrar sólo boards del usuario actual. Para eso debemos hacer dos cosas:
- En el código que crea nuevos boards, debemos asociarlos al usuario actual (
current_user
).
# app/controllers/boards_controller.rb
class BoardsController < ApplicationController
# Localizamos el método "create" ...
def create
# ... y solamente cambiamos la primer línea
@board = current_user.boards.build(board_params)
# El resto del método queda igual
respond_to do |format|
...
end
end
end
- En el listado (action index) se deben seleccionar los boards del usuario
# app/controllers/boards_controller.rb
class BoardsController < ApplicationController
# Localizamos el método "index" y lo dejamos así:
def index
@boards = current_user.boards
end
end
Commit en Git
git add -A
git commit -m "Asociaciones"