【问题标题】:Composite keys with ActiveScaffold in Ruby On RailsRuby On Rails 中带有 ActiveScaffold 的复合键
【发布时间】:2008-10-21 16:14:07
【问题描述】:

我正在开发与旧数据库一起使用的 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 获得复合键功能。

【问题讨论】:

    标签: ruby-on-rails ruby database activescaffold


    【解决方案1】:

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

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

    我找到的一个快速结果是this

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

    这可能对你有用。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我在旧数据库上使用 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-24
          • 1970-01-01
          • 1970-01-01
          • 2016-05-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多