2011-01-31 31 views
7

Tengo dos modelos, Artículo y Receta, que tienen un montón de los mismos atributos y métodos. Quiero hacer que las subclases de una nueva clase "Publicar" y mover toda su lógica compartida allí, así que no estoy manteniendo el código duplicado. He intentado esto:Modelos de subclases en Rails

class Recipe < Post; end 
class Article < Post; end 
class Post < ActiveRecord::Base 
    #all the shared logic 
end 

Todas estas clases se encuentran en la carpeta estándar ./app/models. Sin embargo, este código arroja un error ActiveRecord :: StatementInvalid cuando voy a/articles/new, por ejemplo. El error es:

No se pudo encontrar

Alguna idea de 'mensajes' table cómo configurar esto?

+1

¿Pero creaste la tabla 'publicaciones'? – Matt

Respuesta

9

¿Por qué no utiliza módulos?

module Features 
    def hello 
    p "hello" 
    end 
end 

class Recipe < ActiveRecord::Base 
    include Features 
end 

class Article < ActiveRecord::Base 
    include Features 
end 


Recipe.new.hello 
# => "hello" 

Article.new.hello 
# => "hello" 
+0

Eso es perfecto. Soy nuevo en rails y no sabía nada de eso. Simplemente lea http://handyrailstips.com/tips/14-drying-up-your-ruby-code-with-modules y tiene sentido. ¡Gracias! – weotch

13

Carriles está utilizando el patrón de una sola mesa Inhritance por defecto (sólo Google para ello), por lo que cuando estás subclasificación de un modelo, todos los modelos resultantes usará la misma tabla de base de datos (en este caso posts). Puedes poner todos tus métodos y validaciones comunes en el modelo Post, y específicos en las otras clases, pero todas esas clases tendrán acceso a los campos de los demás, porque comparten la misma tabla (sin embargo, eso no es un gran problema).

Si solo desea compartir el código (métodos), sería mejor simplemente poner algunos métodos comunes en un módulo en un archivo en el directorio lib e incluirlo en cada modelo. O puede poner la definición del módulo en la parte superior si mantiene todos los modelos en un solo archivo como en su ejemplo.

+0

¡Gracias por incluir una explicación de por qué! – ifightcrime

Cuestiones relacionadas