0

У меня есть таблица AuditLog с полями: audited_id | audited_typeRails 3 - polymorphic_path - Как создать Один заданный стол

Это приводит к следующим данным: 108 | Фото 303 | Комментарий

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

здесь есть фото

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

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

<%= 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 

В парциальное который передается местной storyitem:

<%= link_to 'Here she is', polymorphic_path(storyitem.feeded) %> 

миграция файл базы данных, содержит следующую строку для CreateNewsFeeds

t.references :feeded, :polymorphic => true 

ответ

3

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

Update:

Если у вас есть следующие ассоциации (или с помощью acts_as_auditable или что-то, что устанавливает отношения для вас):

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

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

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

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

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

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

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

+1

В случае непонятности AuditLog # auditable возвращает связанный объект, что удобно, поскольку в противном случае вам нужно было бы сделать что-то вроде audited_type.constantize.find (audited_id). –

+0

@ Luke, спасибо, но я не уверен, что я следую ... Правильно ли приведен пример кода? Если нет, каким-либо образом вы могли бы обновить свой ответ? Кроме того, вы говорите, что мне нужно убедиться, что у меня есть функция belongs_to, has_many отношений в моделях для модели Photos? thxs – WozPoz

+0

Люк, спасибо, что так хорошо объяснили. Я думаю, что сейчас получаю общую концепцию, но по какой-то причине я изо всех сил пытаюсь заставить ее работать. Я обновил вопрос с помощью своего кода. Можете ли вы сообщить мне, видите ли вы что-то, что я делаю неправильно? – WozPoz

0

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

У меня была аналогичная проблема, мое решение было взломать метод построения пути от имени класса и идентификатор:

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

метод будет возвращать, например «/ фото/302». Но, конечно, это будет работать только для довольно простых маршрутов.

Смежные вопросы