1

如何在我的視圖中顯示我的多態關聯?我有以下模型。視圖中的多態關聯

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爲什麼返回nil?如何通過我的視圖顯示多態模型的條目?

更新:

的設計,作爲一個用戶,我希望能夠創建類別,並將其分配給我的博客。每個博客都有一個類別,我希望通過類別模型作爲可分類博客訪問。

它應該是非常好的,如果它像邏輯試圖說的那樣工作,但目前情況並非如此。多態模型應該是優雅的,但現在,多態對我來說很糟糕,並且無法使用。我仍在等待有人幫助我提供更好的解決方案。

回答

4

設計存在缺陷。考慮以下幾點:

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

請原諒我以前的答案。 zetetic的答案是絕對有道理的。嘗試避免多形態。

0

更新:我已經決定多態模型不是要走的路,我已經用好的STI解決了它,它可以做同樣的事情。