chaves compostas com ActiveScaffold em Ruby on Rails
-
03-07-2019 - |
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.
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