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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top