Rails 3 - polymorphic_path - 如何创建给定表的一个

时间:2010-10-01 15:26:53

标签: ruby-on-rails ruby-on-rails-3 polymorphic-associations

我的表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

2 个答案:

答案 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”。但当然它只适用于非常简单的路线。