我的表AuditLog包含以下字段:audited_id | audited_type
这导致数据如下: 108 |照片 303 |评论
我想要做的是创建一个项目的链接,所以对于上面的例子:
这是照片
我正在尝试使用polymorphic_path但是收到错误:“Fixnum:Class”的未定义方法`model_name'
使用时:
<%= link_to 'Here she is', polymorphic_path([audited_id, audited_type]) %>
想法?感谢
使用以下Luke的答案更新代码:
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) %>
数据库迁移文件,包含CreateNewsFeeds的以下行
t.references :feeded, :polymorphic => true
答案 0 :(得分: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) %>
获取审核对象的链接。
因此,在类中有多态关联的任何地方,都有一个实例方法设置,其中包含将返回关联对象的关联名称。
天哪,我希望这是有道理的。如果您需要我进一步澄清,请告诉我。答案 1 :(得分:0)
polymorphic_path的问题是它需要一个对象,所以你首先需要从数据库中获取对象。 根据您的使用情况,这可能是一个很大的性能问题。 如果是日志查看器,您可以在其中列出例如100个条目, 并且只想显示entires的链接,你将获取100个对象,只是为了获得它们的路径。
我有类似的问题,我的解决方案是破解一个方法来从类名和id构建路径:
class AuditLog
...
def audited_path
"/#{self.audited_type.tableize}/#{self.audited_id}"
end
该方法将返回例如“/ photos / 302”。但当然它只适用于非常简单的路线。