He seguido la receta #19 del Advanced Rails Recipes, donde en un ejemplo
de
aplicación de Albums y Covers, se modifica el modelo Album para que
tenga un
método save_with_cover y asà pueda salvarse subiendo la foto del cover
con
attachment_fu. OK, todo estupendo…
Pero en mi aplicación real, tengo varias cosas que pueden tener una
foto.
Para eso tiro de la receta #23 del Rails Recipes, de asociaciones
polimórficas, para tener por ejemplo Productos y Disenadores, que ambos
son
fotografiables…
##########################
class Foto < ActiveRecord::Base
belongs_to :fotografiable, :polymorphic => true
end
class Producto < ActiveRecord::Base
has_many :fotos, :as => :fotografiable
end
class Disenador < ActiveRecord::Base
has_one :foto, :as => :fotografiable
end
##########################
etc… ¿me seguÃs?
La cosa es que el método save_con_foto lo necesito en cada modelo
fotografiable, con lo que estoy duplicando código… el mismo método
save_con_foto me vale para Producto, Disenador, y todo lo fotografiable:
##########################
def save_con_foto
foto = Foto.new
begin
self.transaction do
if uploaded_foto_data && uploaded_foto_data.size > 0
foto.uploaded_data = uploaded_foto_data
foto.thumbnails.clear
foto.save!
self.foto = foto
end
save!
end
rescue
if foto.errors.on(:size)
errors.add_to_base(“La imagen subida es demasiado grande.” )
end
if foto.errors.on(:content_type)
errors.add_to_base(“El tipo de imagen no es válido.” )
end
false
end
end
##########################
Mi pregunta es… ¿cómo puedo hacer para que este metodo save_con_foto
esté
en todos mis modelos fotografiables? No estoy muy puesto en herencia. Mi
primer intento ha sido tener un modelo Fotografiable:
##########################
class Fotografiable < ActiveRecord::Base
def save_con_foto
…
end
end
##########################
y heredar los fotografiables de él:
##########################
class Producto < Fotografiable
…
end
class Disenador < Fotografiable
…
end
##########################
pero no es buena idea, pq Fotografiable no tiene su tabla
correspondiente…
¿La solución pasa por usar single-table inheritance? No me vale, creo
que
quedarÃa muy guarro todo en una sola tabla, hay muchos modelos
fotografiables.