ruby on rails - query - Rails ActiveRecord-heredando de una clase base sin tabla
rails sql query (3)
Lo que estoy buscando hacer es tener una clase base para algunos de mis modelos que tenga algún comportamiento de registro de activación predeterminado:
class Option < ActiveRecord::Base
has_many :products
def some_method
#stuff
end
#etc..etc..
end
class ColorOption < Option
#stuff...
end
class FabricOption < Option
#stuff...
end
Sin embargo, quiero que ColorOption y FabricOption estén en sus propias tablas. NO quiero usar STI o tener una tabla para la clase base "Opción". La única manera en que he conseguido que esto funcione es con un poco de magia de metaprogramación sin herencia. Pero me pregunté si habría una manera de decirle a AR que la clase base no necesita una tabla. Solo existe para un comportamiento adicional, y para poner las otras subclases en su propia tabla como de costumbre.
Gracias craig
Lo que quieres es una clase abstracta:
class Option < ActiveRecord::Base
self.abstract_class = true
end
class ColorOption < Option
set_table_name "color_options"
end
class FabricOption < Option
set_table_name "fabric_options"
end
Tengo información adicional sobre STI y #abstract_class en mi blog.
Parece un caso para un módulo que incluyes.
module Option
def self.included(base)
base.has_many :products
end
# other instance methods
end
class ColorOption < ActiveRecord::Base
include Option
set_table_name ''???'' # unless ColorOption / FabricOption have same table -> move to Option module
#stuff...
end
class FabricOption < Option
include Option
set_table_name ''???'' # unless ColorOption / FabricOption have same table -> move to Option module
#stuff...
end
Más información: http://mediumexposure.com/multiple-table-inheritance-active-record/
Tuve un problema similar, pero también quería cambiar la forma en que AR configuraba table_name para mis modelos, que por ejemplo el modelo MyProject tendría el nombre de la tabla "MY_PROJECT".
Lo he logrado creando una clase de AR abstracta, como dijo @FFrançois, y con el método heredado, donde estoy cambiando el nombre de la tabla, de esta manera:
class MyModel < ActiveRecord::Base
self.abstract_class = true
def self.inherited(subclass)
subclass.table_name = subclass.name.underscore.upcase
end
end
class MyProject < MyModel
end
Ahora MyProject.table_name da MY_PROJECT :)