Pergunta

Estou desenvolvendo aplicação RoR que funciona com o banco de dados legado e usos ActiveScaffold plugins para interface de fantasia CRUD.

No entanto uma das mesas de meu legado db tem chave primária composta. Eu tentei usar Composite Chaves de encaixe para lidar com isso, mas parece ter conflitos com ActiveScaffold: eu recebo o seguinte erro:

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'

enquanto tendo no modelo smth código como:

set_primary_keys :contact, :type

Eu altamente apreciar alguma idéia de como posso obter capacidade de chaves compostas com ActiveScaffold.

Foi útil?

Solução

Eu acho que sua melhor aposta pode ser verificando a ActiveScaffold Google Grupo como é monitorado por núcleo desenvolvedores de ActiveScaffold e que acabaria por ser capaz de resolver o seu problema e explicar por que chaves compostas com o plugin não irá funcionar com ActiveScaffold.

Boa sorte e não se esqueça de postar um follow-up se você fizer obter resultados a partir do Grupo do Google (que eu tenho postado antes e recebido um feedback muito rapidamente).

Um resultado rápido eu encontrei foi este .

O que fiz foi criar uma classe de fachada que não herda de
ActiveRecord em seguida, fazer o "id" mostrar a chave primária. No meu caso o
chave primária foi calculado a partir de outros dados e pode mudar como resultado
de uma edição, então eu tive que substituir ActiveScaffold em alguns lugares para
permitir a chave primária mudar após uma atualização. Mas, apesar de tudo
ele funciona e é bastante simples. Comece com uma classe
vazia e apenas resolver mensagens que não são compreendidas. No seu caso você
mesmo poderia simplesmente redirecionar todas as mensagens para um ActiveRecord envolto enquanto
substituindo o ID e id = métodos, e filtrando o [] e [] = métodos.

Isso pode fazer o truque para você.

Outras dicas

Não, eu não recebeu qualquer resposta do grupo e eu não tenho certeza se ActiveScaffold está ativamente ainda mantida.

Depois de algum tempo de jogo com ActiveScaffold, acabei implementando minha própria interface CRUD a partir do zero.

Eu tenho esse trabalho, com modelos de somente leitura, usando ActiveScaffold um legado DB.

O truque era para substituir o campo padrão 'id' no modelo e retornar uma string PK concatenada.

Se isso é bom o suficiente, então aqui vai:

  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

O controlador tem o seguinte no bloco active_scaffold config:

  config.actions.exclude :create, :update, :delete
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top