Otras Páginas

Expandir Todo

Conectando Votos Y Temas

Objetivos

    Topics
    id
    title
    description
    Votes
    id
    topic_id

    Porque hay una relación explícita entre un tema y sus votos, necesitamos especificar eso. En este paso, declararemos explícitamente la relación entre los votos y los temas.

Pasos

Paso 1: Enséñale al modelo Topic acerca de Votes

Edita app/models/topic.rb para que quede así:

class Topic < ActiveRecord::Base
  has_many :votes, dependent: :destroy
end

Paso 2: Enséñale al modelo Vote acerca de Topics

Edita app/models/vote.rb para que quede así:

class Vote < ActiveRecord::Base
  belongs_to :topic
end

Paso 3: Juega un poco con los temas y votos en la consola de Rails

Primero, asegúrate de que has hecho por lo menos un tema en el sitio.

Luego, abre la consola de Rails en una terminal:
rails c
Expected result:
$ rails c
Loading development environment (Rails 4.0.0)
1.9.3-p194 :001 >

En la consola, intenta lo siguiente

Ve cuántos temas existen:
Topic.count
Guarda el primer tema en una variable:
mi_tema = Topic.first

mi_tema aquí podríamos tener cualquier nombre de variable, pero nos apegaremos a mi_tema por consistencia.

Cambia el título de ese tema por cualquier otro:
mi_tema.update_attributes(title: 'Editado en la consola')
Agrega un voto a ese tema:
mi_tema.votes.create
Ve cuántos votos tiene ese tema:
mi_tema.votes.count
Elimina un voto de ese tema:
mi_tema.votes.first.destroy

Observa que las cosas que puedes hacer con las Clases de Modelo (como Topic y Vote), son diferentes a las cosas que puedes hacer con las Instancias de Modelo (como mi_tema). mi_tema.votes es una asociación, y aquí se comporta mayormente como una clase de modelo.

Clase de Modelo / métodos de asociación
  • Topic.first
  • Topic.last
  • Topic.all
  • Topic.count
  • Topic.find_by_id(5)
  • Topic.destroy_all
  • mi_tema.votes.count
  • mi_tema.votes.create
  • mi_tema.votes.destroy_all
Métodos de Instancia de Modelo
  • mi_tema.title
  • mi_tema.title = 'New title'
  • mi_tema.update_attributes(title: 'New title')
  • mi_tema.save
  • mi_tema.save!
  • mi_tema.destroy
  • mi_tema.votes.first.destroy

Una lista exhaustiva de cosas que puedes hacer con los modelos y asociaciones se encuentra en Active Record Query Interface RailsGuide.

Explicación

has_many y belongs_to:

  • En Rails, las relaciones entre modelos son llamadas asociaciones.
  • Asociaciones (por regla general) vienen en pares.
  • Un tema tendrá muchos votos, por lo tanto ponemos has_many :votes en el modelo Topic.
    • Cuando preguntamos a un tema por sus votos, obtendrás un arreglo de votos para ese tema.
  • Un voto es para un tema en particular, por lo tanto ponemos belongs_to :topic en el modelo Vote.
    • Cuando preguntamos a un voto por su tema, obtendrás el tema para ese voto.

Esto es importante para que te asegures de limpiar: dependent: :destroy en has_many :votes significa que cuando un Topic se destruye, todos los votes que corresponden a él serán destruídos también. Si no ponemos dependent :destroy, estos votos vivirían en la base de datos para siempre.

Siguiente Paso: