Полиморфные ассоциации во взглядах - PullRequest
1 голос
/ 27 февраля 2011

Как мне отобразить мои полиморфные ассоциации в моем представлении? У меня есть следующая модель.

class Blog < ActiveRecord::Base
  belongs_to :users
  has_one :category, :as => :categorizable
end

class Category < ActiveRecord::Base
  belongs_to :categorizable, :polymorphic => true
end

class User < ActiveRecord::Base
  has_many :blogs
  has_many :categories, :as => :categorizable
end

Однако моя проблема в том, что я получаю ноль при попытке отобразить категорию.

rails console
 => user = User.first
 => user.blogs
[]
 => user.categories
[]
 => category = user.categories
 => category = Category.new
 => category.name = "Education"
 => category.save!
true
 => user.categories
[#<Category id: 1, name: "Education", categorizable_id: 1, categorizable_type: "User", created_at: "...", updated_at: "...">]
 => user.blogs.create(:title => "...", :body => "...", :category => category)
[#<Blog id: 1, user_id: 1, title: "...", body: "...", created_at: "...", updated_at: "...">] 
 => blogs = user.blogs.all
 => blogs.each do |blog|
      puts blog.category
    end
nil
 => blogs.first.category
[#<Category id: 1, name: "Education", categorizable_id: 1, categorizable_type: "User", created_at: "...", updated_at: "...">]

Я не понимаю, почему blog.category возвращает ноль, когда я использую каждый блок? Как отобразить записи моей полиморфной модели через мои представления?

Обновление:

Как пользователь, я хочу создавать категории и назначать их своим блогам. У каждого блога есть одна категория, к которой я хотел бы получить доступ через модель Категории как категорируемый блог.

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

Ответы [ 3 ]

4 голосов
/ 27 февраля 2011

В дизайне есть недостаток.Рассмотрим следующее:

user = User.create
cat = user.categories.create(:name=>"Education")

Теперь есть одна категория:

> cat
# Category id: 1, name: "Education" categorizable_id:1 categorizable_type: "User"

Когда вы добавляете блог и назначаете ему ту же категорию:

user.blogs.create(:category=>cat)

Он переписывает полиморфный тип и идентификатор:

# UPDATE "categories" SET "categorizable_type" = 'Blog', "categorizable_id" = 1,
  "updated_at" = '2011-02-27 06:20:29.968336' WHERE ("categories"."id" = 1)

И теперь категория больше не связана с пользователем:

user.reload
user.categories # => []

Вы действительно пытаетесь смоделировать отношения многие ко многимВот.Я бы предложил добавить таблицы соединений для UserCategory и BlogCategory и избавиться от полиморфизма, который не помогает.

1 голос
/ 27 февраля 2011

Простите за мой предыдущий ответ.Ответ Zetetic имеет абсолютный смысл.Старайтесь избегать полиморфов.

0 голосов
/ 27 февраля 2011

Обновление: я решил, что полиморфная модель - это не тот путь, и я решил ее с хорошим старым ИППП, который делает то же самое.

...