Rails的多态关系的link_to
-
18-09-2019 - |
题
下面是我的模式
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
在的情况下,这是不够的,你可能会使用某种形式的缓存。
不隶属于 StackOverflow