Ruby On RailsのActiveScaffoldを使用した複合キー
-
03-07-2019 - |
質問
レガシーデータベースで動作し、派手なCRUDインターフェイスにActiveScaffoldプラグインを使用するRoRアプリケーションを開発しています。
ただし、レガシーデータベースのテーブルの1つに複合主キーがあります。 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で複合キー機能を取得する方法についてのアイデアを高く評価しています。
解決
最善の策は、コアによって監視されている ActiveScaffold Googleグループを確認することです。 ActiveScaffoldの開発者が最終的にあなたの問題を解決し、プラグインを使用した複合キーがActiveScaffoldで機能しない理由を説明することができます。
幸運なことに、Googleグループから結果が得られた場合はフォローアップを必ず投稿してください(以前に投稿し、非常に迅速にフィードバックを受け取りました)。
私が見つけた簡単な結果の1つは、これ。
私がしたことは、継承しないファサードクラスを作成することでした
その後、ActiveRecordは&quot; id&quot;を作成します。主キーを表示します。私の場合、
主キーは他のデータから計算され、結果として変更される可能性があります
編集のため、いくつかの場所でActiveScaffoldをオーバーライドして
更新後に主キーを変更できるようにします。しかし、すべて
それは機能し、かなり簡単です。空のクラスから始めます
理解されていないメッセージだけを解決します。あなたの場合
ラップされたActiveRecordにすべてのメッセージをリダイレクトすることもできます
idおよびid =メソッドを置き換え、[]および[] =メソッドをフィルタリングします。
それはあなたのためにトリックをするかもしれません。
他のヒント
いいえ、グループからの返信はありません。ActiveScaffoldがアクティブに維持されているかどうかはわかりません。
ActiveScaffoldでしばらく遊んだ後、私は最初から独自のCRUDインターフェイスを実装することになりました。
レガシーDBで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