2011-02-07 13 views
0

這樣做的最佳方式是什麼?我希望能夠通過多態性給樂隊和藝術家流派。我可以用habtm和has_many做到這一點:通過但我試圖找出是否可能通過多態。Rails與查找表多形態

GenreList將是具有不同流派列表(例如朋克,流行音樂,金屬)的查找表。我回顧了Ryan Bate對Polymorphic Assoiciations的截屏,但我仍然陷入困境。具體來說,我不知道如何創建將從GenreList模型(查找表)中獲取罐頭流派的多態表格流派。

下面是否正確?

rails generate model Genre genre_list_id:integer genreable_id:integer genreable_type:string 

class Artist < ActiveRecord::Base 
    has_many :genres, :as => :genreable 
end 

class Band < ActiveRecord::Base 
    has_many :genres, :as => :genreable 
end 

class Genre < ActiveRecord::Base 
    belongs_to :genreable, :polymorphic => true 
end 

class GenreList < ActiveRecord::Base 
end 

回答

1

好吧,6.5小時後,我設法弄清楚了這一點。我使用了inherited_resources gem來幫助控制器。總而言之,我希望能夠通過多態關係將流派添加到藝術家和樂隊中,即流派將成爲查找表,而流派將是包含藝術家和樂隊流派的多態模型。下面是我工作的代碼:

# Generate some scaffolding 
rails generate scaffold Artist name:string 
rails generate scaffold Band name:string 
rails generate scaffold Genre name:string 
rails generate scaffold Genreing genre_id:integer genreable_id:integer genreable_type:string 

# Models 
class Artist < ActiveRecord::Base 
    has_many :genreings, :as => :genreable 
    has_many :genres, :through => :genreings 
end 

class Band < ActiveRecord::Base 
    has_many :genreings, :as => :genreable 
    has_many :genres, :through => :genreings 
end 

class Genre < ActiveRecord::Base 
    attr_accessible :name 
    has_many :genreings 
end 

class Genreing < ActiveRecord::Base 
    attr_accessible :genre, :genre_id, :genreable, :genreable_type, :genreable_id 
    belongs_to :genre 
    belongs_to :genreable, :polymorphic => true 
end 

# Controller 
class GenreingsController < InheritedResources::Base 
    belongs_to :genreable, :polymorphic => true 
end 

# Artist Form View 
= simple_form_for(@artist) do |f| 

    .inputs 
    = f.input :name 
    = f.association :genres, :as => :check_boxes 

    .actions 
    = f.button :submit 

# Band Form View 
... (Similar to Artist) 
0

這是正確的。似乎缺少的一件事是從類型列表has_many關係類型

class GenreList < ActiveRecord::Base 
    has_many :genres 
end 
+0

Stephan,謝謝你。現在我正在嘗試對視圖和控制器進行排序以使其實際工作。 – face7hill 2011-02-09 00:32:35

1

我認爲你的實現有點怪異。我會這樣做的方式是創建一個模型流派(它將容納所有可用的流派朋克,搖滾,金屬等)。然後,我會做這一切,你已經做了,但沒有GenreList型號:

rails g model Genre genreable_id:integer genreable_type:string genre_name:string 

class Artist < ActiveRecord::Base 
    has_many :genres, :as => :genreable 
end 

class Band < ActiveRecord::Base 
    has_many :genres, :as => :genreable 
end 

class Genre < ActiveRecord::Base 
    belongs_to :genreable, :polymorphic => true 
end 

然後我會做的做一些嵌套資源在我的路線爲:

resources :artists do 
    resources :genres 
end 

resources :bands do 
    resources :genres 
end 

,然後編輯我的控制器來處理這個嵌套關係。通過這種方法說,如果我想看到所有的第一個藝術家的我將訪問類型:

/artists/1/genres 

同樣適用於帶。我希望我能理解你的問題。讓我知道如果我幫助!

+0

xlubyonrails,抱歉我遲到的迴應。我仍然在嘲笑這件事。你的答案是有幫助的,但我真的想把體裁列表保存在它自己的表中,以便參照完整性。我只想將genre_list_ids存儲在多態表中。這比我預想的要複雜得多。基本上,當我添加/編輯藝術家或樂隊時,我希望能夠一舉覈對流派,並將流派存儲在流派多態表中。我正在查看inherited_resources以查看是否有助於簡化。如果我取得進展,我會發布我的結果。謝謝! – face7hill 2011-02-09 00:37:04