下面是我的模式

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,e.g在菜单视图链接到一个多态类。

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

这工作,但这个检索menuable对象从数据库中,当所有我想要的是生成的链接。你可以想像,如果我的菜单是大的,这真的会拖垮我的应用程序。

当我decared的menuable字段作为多晶型,导轨创建menuable_type和menuable_id。我可以用生成的链接页面多态性,用一根巨大的switch语句写一个辅助功能(例如,如果我有大量的menuable“子”吗?)

有帮助吗?

解决方案

它已经早已有人问,但最近我有同样的问题和解决方案是使用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”不脱离数据库下载的汽车。

我在铁轨一个小白,我不知道他的意见有多好,但我希望这将是对别人有帮助的。

其他提示

您可以做这样的事情:

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

如果您使用Rails约定命名的控制器,记者到您的模型。

不过,不这样做。您解决轨道的路由机制,这就是根本不好的做法。

您应该使用:在您的发现者跃跃欲试选项加载menuables:

Menu.all :include => :menuable

在的情况下,这是不够的,你可能会使用某种形式的缓存。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top