1

我正在开发与旧数据库一起使用的 RoR 应用程序,并将 ActiveScaffold 插件用于精美的 CRUD 界面。

但是,我的旧数据库的一张表具有复合主键。我尝试使用 Composite Keys 插件来处理它,但它似乎与 ACtiveScaffold 有冲突:我收到以下错误:

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'

在模型代码中,例如:

set_primary_keys :contact, :type

我非常感谢任何想法如何使用 ActiveScaffold 获得复合键功能。

4

3 回答 3

2

我认为您最好的选择可能是检查ActiveScaffold Google Group,因为它由 ActiveScaffold 的核心开发人员监控,他们最终将能够解决您的问题并解释为什么带有插件的复合键不适用于 ActiveScaffold。

祝你好运,如果您确实从 Google 群组中获得了结果(我之前已经发布过并且很快收到了反馈),请务必发布后续内容。

我发现的一个快速结果是这个

我所做的是创建一个不从
ActiveRecord 继承的外观类,然后使“id”显示主键。在我的例子中,
主键是根据其他数据计算出来的,并且可能会因
编辑而改变,所以我必须在几个地方覆盖 ActiveScaffold 以
允许在更新后更改主键。但是,总而言之,
它有效并且相当简单。从一个空类开始
,只解决不理解的消息。在您的情况下,您
甚至可以将所有消息重定向到包装的 ActiveRecord,同时
替换 id 和 id= 方法,并过滤 [] 和 []= 方法。

这可能对你有用。

于 2008-10-21T17:18:12.470 回答
0

不,我没有收到小组的任何回复,我不确定 ActiveScaffold 是否正在积极维护。

在玩了一段时间的 ActiveScaffold 之后,我最终从头实现了自己的 CRUD 接口。

于 2008-10-27T10:30:14.187 回答
0

我有这个工作,只读模型,在遗留数据库上使用 ActiveScaffold。

诀窍是覆盖模型中的默认“id”字段并返回连接的 PK 字符串。

如果这足够好,那么你去:

  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

控制器在 active_scaffold 配置块中有以下内容:

  config.actions.exclude :create, :update, :delete
于 2012-10-05T22:11:32.357 回答