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"

Siguiente: 1.9. Deployment