references rails query left joins includes has_and_belongs_to_many active ruby-on-rails activerecord

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 :)