0

次のフィールドを持つテーブル AuditLog があります。監査済み_タイプ

その結果、次のようなデータが得られます。写真 303 | コメント

私がやりたいことは、アイテムへのリンクを作成することなので、上記の例では:

ここに写真があります

polymorphic_path を使用しようとしていますが、エラーが発生します:「Fixnum:Class の未定義メソッド `model_name'」

使用時:

<%= link_to 'Here she is', polymorphic_path([audited_id, audited_type]) %>

アイデア?ありがとう

以下のルークの回答に基づいたコードで更新します。

class NewsFeed < ActiveRecord::Base
    default_scope :order => 'news_feeds.created_at DESC'    
    belongs_to :feeded, :polymorphic => true
end

class Note < ActiveRecord::Base
  has_many :newsfeed, :as => :feeded
end

ローカル ストーリー アイテムに渡されるパーシャルでは、次のようになります。

<%= link_to 'Here she is', polymorphic_path(storyitem.feeded) %>

DB 移行ファイルには、CreateNewsFeeds の次の行が含まれています。

  t.references :feeded, :polymorphic => true
4

2 に答える 2

3

AuditLog オブジェクトにメソッド #auditable (またはポリモーフィック アソシエーションが呼び出されるもの) が必要です。そのメソッドの結果を polymorphic_path に渡すと、正しいパスが返されます。

アップデート:

次の関連付けがあると仮定します (または、acts_as_auditable または関係を設定する何かを使用している)。

class AuditLog
  belongs_to :auditable, :polymorphic => true
end

class AuditedObject
  has_many :audits, :as => :auditable
end

AuditLog の任意のインスタンスで auditable を呼び出すことができ、関連する監査済みオブジェクトが返されます。だからあなたは呼び出すことができます

<%= link_to 'Here she is', polymorphic_path(audit_log.auditable) %>

監査対象オブジェクトへのリンクを取得します。

したがって、クラス内にポリモーフィックな関連付けがある場所には、関連付けられたオブジェクトを返すその関連付けの名前を持つインスタンス メソッドがセットアップされます。

まあ、それが理にかなっていることを願っています。さらに明確にする必要がある場合はお知らせください。

于 2010-10-01T15:45:19.723 に答える
0

polymorphic_path の問題にはオブジェクトが必要なため、最初にデータベースからオブジェクトをフェッチする必要があります。ユースケースによっては、これは大きなパフォーマンスの問題になる可能性があります。たとえば 100 エントリのリストがあり、全体へのリンクを表示したいログ ビューアの場合、パスを取得するためだけに 100 個のオブジェクトをフェッチします。

私は同様の問題を抱えていました。私の解決策は、クラス名とIDからパスを構築するメソッドをハックすることでした:

class AuditLog
...
def audited_path
    "/#{self.audited_type.tableize}/#{self.audited_id}"
end

このメソッドは、たとえば "/photos/302" を返します。もちろん、非常に単純なルーティングでのみ機能します。

于 2011-10-12T17:02:30.100 に答える