Полиморфные ассоциации в Rails для разных «авторских» моделей - PullRequest
0 голосов
/ 27 июля 2011

Как бы Полиморфная Ассоциация (здесь: Комментарии ) сама ассоциировалась с разными типами Авторов?

Начиная с ...

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => :true
end

... я бынужно, чтобы один автор был из модели Хосты, ID 5 , а другой - из Users, 2 .

Как могут выглядеть помощники пути…

<%= link_to comment.author.name, user_path(comment.author) %>

… когда «user_path» или «host_path» являются динамическими, в зависимости от модели автора?

РЕДАКТИРОВАТЬ ***

Есть события, места и т. Д.., которые могут иметь комментарии, например:

  has_many :comments, :as => :commentable

К полиморфной модели комментариев я хотел бы добавить идентификаторы и типы для ссылки на авторов комментариев:

  create_table "comments", :force => true do |t|
    t.text     "content"
    t.integer  "commentable_id"
    t.string   "commentable_type"
    t.integer  "author_id"
    t.string   "author_type"
  end

Отображается страница событий.комментарии и щелчок по имени автора должны привести меня либо к User (5), либо к AnotherModel (2), в зависимости от того, кто написал комментарий.

Я хотел бы знать, как все справляются с такой ситуацией.Стоит ли подумать о добавлении второго полиморфного «среднего слоя», такого как «профиль», который может содержать подклассы «Пользователь», «Хост» и т. Д.

РЕДАКТИРОВАТЬ 2

Наличие только одной пользовательской модели, очевидно, облегчит жизнь здесь, но этого нельзя сделать по другим причинам.И вообще мне интересно, как это можно было бы хорошо организовать.

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Проще говоря

<%= link_to comment.author.name, comment.author %>

должен сделать свое дело. Если вы хотите больше гибкости, я бы предложил

link_to ..., action_in_host_path(comment.author) if comment.author.kind_of? Host
0 голосов
/ 27 июля 2011

Поможет ли polymorphic_url ?

<% = link_to comment.author.name, polymorphic_url (comment.commentable) %>

0 голосов
/ 27 июля 2011

Это то, что я использовал в прошлом (в помощнике вида), но он использует eval:

def model_path(model, options = {})
    {:format => nil}.merge(options)
    format = (options[:format].nil? ? 'nil' : "'#{options[:format].to_s}'")
    eval("#{model.class.to_s.downcase}_path(#{model.id}, :format => #{format})")
end

Используйте вот так:

<%= link_to comment.author.name, model_path(comment.author) %>
...