Estoy trabajando en una aplicación Rails muy grande. Inicialmente no usamos mucha herencia, pero hemos tenido algunas experiencias de apertura de un consultor y estamos buscando refactorizar algunos de nuestros modelos.¿Cuántas clases son demasiadas? Rails STI
Tenemos el siguiente patrón mucho en nuestra aplicación:
class Project < ActiveRecord::Base
has_many :graph_settings
end
class GraphType < ActiveRecord::Base
has_many :graph_settings
#graph type specific settings (units, labels, etc) stored in DB and very infrequently updated.
end
class GraphSetting < ActiveRecord::Base
belongs_to :graph_type
belongs_to :project
# Project implementation of graph type specific settings (y_min, y_max) also stored in db.
end
Esto también se traduce en una tonelada de condicionales en las vistas, ayudantes y en el propio modelo de GraphSetting. Nada de esto es bueno.
Un refactor simple donde nos deshacemos de GraphType en favor del uso de una estructura de la misma familia:
class Graph < ActiveRecord::Base
belongs_to :project
# Generic methods and settings
end
class SpecificGraph < Graph
# Default methods and settings hard coded
# Project implementation specific details stored in db.
end
Ahora bien, esto tiene mucho sentido para mí, facilita las pruebas, elimina los condicionales, y hace más adelante internacionalización más fácil. Sin embargo, solo tenemos de 15 a 30 gráficos.
Tenemos un modelo muy similar (complicado de usar como ejemplo) con cerca de probablemente 100 'tipos' diferentes, y podría duplicar eso. Todos tendrían relaciones y métodos que heredarían, algunos necesitarían anular más métodos que otros. Parece el uso perfecto, pero parece que muchos simplemente parecen muchos.
¿Hay 200 clases de STI para muchas? ¿Hay algún otro patrón que deberíamos mirar?
Gracias por su sabiduría y responderé a cualquier pregunta.
Gracias por la respuesta. En este punto, no creo que tengamos muchos (si los hubiera) valores nulos en la base de datos, ya que las propiedades son las mismas, solo cambiarían los valores y métodos. (Por ejemplo, cómo devuelve los datos del gráfico para trazarlos). Si terminamos con campos nulos (tal vez no esta instancia en particular, pero otros similares) Sin duda tendré esto en cuenta. –
Hay otro enfoque similar en http://stackoverflow.com/questions/1634668/multiple-table-inheritance-vs-single-table-inheritance-in-ruby-on-rails/1634734#1634734 –