Porque no aprenderlo ahora!!
Polimorfismo y asociasiones polimorficas
En POO (Programación Orientada a Objetos) el polimorfismo hace referencia a múltiples objetos y clases que responden de manera distinta al mismo mensaje. El siguiente ejemplo en Ruby demuestra lo anterior:
class Games def play end end class MusicalInstruments def play end end class Violin < MusicalInstruments def play puts "I am playing the violin" end end class Guitar < MusicalInstruments def play puts "I am playing the guitar" end end
Para cada instancia de las distintas clases se obtendrán distintos resultados al ejecutar el mismo método “play”. Esta es una de las situaciones más comunes que pueden enfrentar los desarrolladores, en este caso se requiere hacer uso de esta definición y sus variantes. Tal es el caso, de requerir modelos que pertenezcan a más de un modelo en una única asociación. Supongamos el caso del “Like” entendido como modelo dentro de una aplicación de red social, se puede atribuir este modelo a diversas tablas como imágenes, comentarios, publicaciones, videos, entre otros; generando distintas respuestas en la aplicación. Considerando estas características se puede decir que todos estos modelos son “Likeables” entendiendo que es válido ejercer la acción del modelo “Like” de manera indiferente en cada caso en particular generando las siguientes relaciones.
class Like < ApplicationRecord belongs_to :likeable, polymorphic: true end class Video < ApplicationRecord has_many :likes, as: :likeable end class Picture < ApplicationRecord
Para crear este tipo de relaciones se puede generar la migración del modelo de “likes” como se muestra a continuación.
class CreateLikes < ActiveRecord::Migration[3.0]
def change
create_table :likes do |t|
t.references :likeable, polymorphic: true
t.timestamps
end
end
end
Es importante resaltar que para generar este modelo se tiene la posibilidad de hacer uso de los generadores automáticos de modelos de Rails, escribiendo en la consola el comando $rails generate model Like likeable:references{polymorphic}.