ruby-on-rails ruby-on-rails-3 single-table-inheritance

ruby on rails - Rieles: ¿usa una columna tipo sin STI?



ruby-on-rails ruby-on-rails-3 (5)

En Rails 3.1 set_inheritance_column está en desuso, también puedes usar nil como nombre, así:

class Pancakes < ActiveRecord::Base self.inheritance_column = nil #... end

Quiero utilizar una columna llamada type sin invocar herencia de tabla única (ITS): solo quiero que el type sea ​​una columna normal que contiene una String .

¿Cómo puedo hacer esto sin que Rails espere que tenga herencia de tabla única y lanzar una excepción de The single-table inheritance mechanism failed to locate the subclass...This error is raised because the column ''type'' is reserved for storing the class in case of inheritance. ?

¿Alguna idea sobre cómo hacer esto?


Puede anular el nombre de la columna STI usando set_inheritance_column :

class Pancakes < ActiveRecord::Base set_inheritance_column ''something_you_will_not_use'' #... end

Así que elija un nombre de columna que no usará para nada y alimente eso a set_inheritance_column .


Sé que esta pregunta es bastante antigua y esto se aparta un poco de la pregunta que me hace, pero lo que siempre hago cuando siento la necesidad de nombrar un tipo de columna o algo_es decir es que busco un sinónimo de tipo y lo uso en su lugar:

Aquí hay un par de alternativas: tipo, género, variedad, categoría, conjunto, género, especie, orden, etc.


Si desea hacer esto para todos los modelos, puede pegar esto en un inicializador.

ActiveSupport.on_load(:active_record) do class ::ActiveRecord::Base # disable STI to allow columns named "type" self.inheritance_column = :_type_disabled end end


Rails 4.x

Encontré el problema en una aplicación de Rails 4 , pero en Rails 4 el método set_inheritance_column no existe en absoluto, así que no puedes usarlo.

La solución que funcionó para mí fue deshabilitar la herencia de tabla única anulando el método inheritance_column de ActiveRecord , como este:

class MyModel < ActiveRecord::Base private def self.inheritance_column nil end end

¡Espero eso ayude!