Hay una diferencia fundamental entre estos dos métodos que todas las otras respuestas están perdiendo, y eso es la aplicación rieles de las ITS (Herencia de tablas individual):
http://api.rubyonrails.org/classes/ActiveRecord/Base.html (Busque la sección 'Single herencia de tabla')
Básicamente, si usted refactorizar la clase base como esto:
class Base < ActiveRecord::Base
def foo
puts "foo"
end
end
class A < Base
end
class B < Base
end
a continuación, se supone que tiene una tabla de base de datos llamada "bases", con una columna denominada "tipo", que debe tener un valor de " Un "o" SEGUNDO". Las columnas de esta tabla serán las mismas en todos sus modelos, y si tiene una columna que pertenece a solo uno de los modelos, su tabla de "bases" se desnormalizará.
Mientras que, si refactoriza su clase base como esto:
Module Base
def foo
puts "foo"
end
end
class A < ActiveRecord::Base
include Base
end
class B < ActiveRecord::Base
include Base
end
Entonces no habrá "bases" de mesa. En cambio, habrá una tabla "como" y una tabla "bs". Si tienen los mismos atributos, las columnas deberán duplicarse en ambas tablas, pero si hay diferencias, no se denomarán.
Por lo tanto, si uno es preferible sobre el otro, sí, pero eso es específico para su aplicación. Como regla general, si tienen exactamente las mismas propiedades o una gran superposición, use STI (primer ejemplo), sino, use Módulos (segundo ejemplo).
¿Quiso incluir la definición de foo en las subclases en el ejemplo de la clase base? –
No, no lo hice. Gracias. Lo quité. –