Teclas compuestas con ActiveScaffold en Ruby On Rails
-
03-07-2019 - |
Pregunta
Estoy desarrollando una aplicación RoR que funciona con bases de datos heredadas y utiliza el complemento ActiveScaffold para una interfaz CRUD elegante.
Sin embargo, una de las tablas de mi db heredado tiene una clave primaria compuesta. Intenté usar el complemento Composite Keys para manejarlo, pero parece tener conflictos con ACtiveScaffold: aparece el siguiente error:
ActionView::TemplateError (Could not find column contact,type) on line #3 of ven
dor/plugins/active_scaffold/frontends/default/views/_form.rhtml:
1: <ol class="form" <%= 'style="display: none;"' if columns.collapsed -%>>
2: <% columns.each :for => @record do |column| -%>
3: <% if is_subsection? column -%>
4: <li class="sub-section">
5: <h5><%= column.label %> (<%= link_to_visibility_toggle(:default_visible =
> !column.collapsed) -%>)</h5>
6: <%= render :partial => 'form', :locals => { :columns => column } %>
vendor/plugins/active_scaffold/lib/data_structures/sorting.rb:16:in `add'
mientras tiene en el código del modelo algo así como:
set_primary_keys :contact, :type
Aprecio mucho cualquier idea de cómo puedo obtener la capacidad de teclas compuestas con ActiveScaffold.
Solución
Creo que su mejor opción puede ser verificar el ActiveScaffold Google Group ya que es monitoreado por el núcleo desarrolladores de ActiveScaffold y finalmente podrían resolver su problema y explicar por qué las claves compuestas con el complemento no funcionarán con ActiveScaffold.
Buena suerte y asegúrese de publicar un seguimiento si obtiene resultados del Grupo de Google (que publiqué antes y recibí comentarios muy rápidamente).
Uno de los resultados rápidos que se encontró fue esto .
Lo que hice fue crear una clase de fachada que no hereda de
ActiveRecord luego crea el " id " muestra la clave primaria. En mi caso el
la clave primaria se calculó a partir de otros datos y podría cambiar como resultado
de una edición, así que tuve que anular ActiveScaffold en algunos lugares para
permitir que la clave principal cambie después de una actualización. Pero, en general,
funciona y es bastante sencillo. Comience con una clase vacía
y solo resuelve mensajes que no se entienden. En tu caso tu
incluso podría redirigir todos los mensajes a un ActiveRecord envuelto mientras
reemplazando los métodos id e id =, y filtrando los métodos [] y [] =.
Eso puede hacer el truco para usted.
Otros consejos
No, no he recibido ninguna respuesta del grupo y no estoy seguro de si ActiveScaffold se mantiene activamente todavía.
Después de jugar un tiempo con ActiveScaffold, terminé implementando mi propia interfaz CRUD desde cero.
Tengo esto funcionando, con modelos de solo lectura, usando ActiveScaffold en una base de datos heredada.
El truco consistía en anular el campo 'id' predeterminado en el modelo y devolver una cadena PK concatenada.
Si eso es lo suficientemente bueno, aquí tienes:
class CPKReadonlyModel < ActiveRecord::Base
set_primary_key :id_one # only half of it, but id overridden below...
def id
self.id_one.to_s + ',' + self.id_two.to_s
end
def readonly?
true
end
def before_destroy
raise ActiveRecord::ReadOnlyRecord
end
def delete
raise ActiveRecord::ReadOnlyRecord
end
def self.delete_all
raise ActiveRecord::ReadOnlyRecord
end
end
El controlador tiene lo siguiente en el bloque de configuración active_scaffold:
config.actions.exclude :create, :update, :delete