4

これが私のスキーマです

class Menu < ActiveRecord::Base
  belongs_to :menuable, :polymorphic => true
end

class Page < ActiveRecord::Base
  has_one :menu, :as => :menuable
end

class Links < ActiveRecord::Base
  has_one :menu, :as => :menuable
end

link_to を使用して、Menu ビューでポリモーフィック クラスにリンクしたい。

<%= link_to menu.name, menu.menuable %>

これは機能しますが、リンクを生成することだけが必要な場合に、データベースからメニュー可能なオブジェクトを取得します。メニューが大きいと、アプリケーションが本当に動かなくなることは想像に難くありません。

menuable フィールドをポリモーフィックとして宣言すると、Rails によって menuable_type と menuable_id が作成されました。多態的なページへのリンクを生成するには、巨大な switch ステートメントを使用してヘルパー関数を記述する以外に、何を使用できますか (たとえば、多数のメニュー可能な「サブクラス」がある場合)。

4

4 に答える 4

7

質問されてから長い時間が経ちましたが、最近同じ問題が発生し、解決策は を使用することでしたpolymorphic_url。「fast_car_path」など、リンクを作成する必要があるルートの名前を見つけて、ポリモーフィック テーブルの *_type と *_id から作成する必要があります。たとえば、コメントのリストがあり、それらが属する車へのリンクを作成したいとします。*_type = FastCar の場合

@comments.each do |comment|
  link_to polymorphic_url(comment.commentable_type.tableize.singularize, :id => comment.commentable_id) 

データベースから車をダウンロードせずに「fast_car_path」を生成します。

私はレールの初心者で、そのアドバイスがどれほど良いかわかりませんが、誰かの役に立てば幸いです。

于 2013-11-26T04:48:53.943 に答える
1

あなたはこのようなことをすることができます:

def my_menu_url(menu)
  "/#{menu.menuable_type.tableize}/#{menu.menuable_id}"
end

モデルに対応するコントローラーに名前を付けるためにrails規則を使用する場合。

しかし、それをしないでください。レールのルーティングメカニズムを回避しますが、これは単に悪い習慣です。

メニュー可能なものを熱心にロードするには、ファインダーで:includeオプションを使用する必要があります。

Menu.all :include => :menuable

これだけでは不十分な場合は、何らかのキャッシュを使用できます。

于 2009-08-16T10:04:01.587 に答える