Rails 3 - polymorphic_path - как создать одну таблицу - PullRequest
0 голосов
/ 01 октября 2010

у меня есть таблица AuditLog с полями, включая: audited_id | audited_type

Это приводит к таким данным, как: 108 | Фото 303 | Комментарий

Что я хочу сделать, это создать ссылку на элемент, поэтому для примера выше:

вот фото

Я пытаюсь использовать polymorphic_path, но получаю сообщение об ошибке: "неопределенный метод` имя_модели 'для Fixnum: Class "

При использовании:

<%= link_to 'Here she is', polymorphic_path([audited_id, audited_type]) %>

Идеи? Спасибо

Обновление с кодом, основанным на ответе Люка ниже:

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 ]

3 голосов
/ 01 октября 2010

У вас должен быть метод #auditable (или как там называется ваша полиморфная ассоциация) для объектов AuditLog. Если вы передадите результат этого метода в polymorphic_path, он вернет вам правильный путь.

Обновление:

Предполагая, что у вас есть следующие ассоциации (или вы используете act_as_auditable или что-то, что устанавливает отношения для вас):

class AuditLog
  belongs_to :auditable, :polymorphic => true
end

class AuditedObject
  has_many :audits, :as => :auditable
end

Вы сможете вызвать auditable для любого экземпляра AuditLog, и он вернет связанный аудированный объект. Так что вы можете позвонить

<%= link_to 'Here she is', polymorphic_path(audit_log.auditable) %>

чтобы получить ссылку на проверяемый объект.

Таким образом, в любом месте, где у вас есть полиморфная ассоциация в классе, есть настройка метода экземпляра с именем этой ассоциации, которая будет возвращать связанный объект.

Черт возьми, я надеюсь, что это имеет смысл. Дайте мне знать, если я понадоблюсь вам, чтобы уточнить это.

0 голосов
/ 12 октября 2011

Проблема с polymorphic_path требует наличия объекта, поэтому сначала нужно извлечь объект из базы данных.В зависимости от вашего варианта использования это может быть большой проблемой производительности.В случае просмотра журнала, где у вас есть список, например, из 100 записей, и вы просто хотите показать ссылки на входы, вы получите 100 объектов, просто чтобы узнать их путь.проблема, мое решение состояло в том, чтобы взломать метод для построения пути из имени класса и id:

class AuditLog
...
def audited_path
    "/#{self.audited_type.tableize}/#{self.audited_id}"
end

Метод вернет, например, "/ photos / 302"Но, конечно, это будет работать только для довольно простых маршрутов.

...