Rails多态与查找表

最好的方法是什么? 我希望能够通过多态性给乐队和艺术家带来流派。 我可以用habtm和has_many做到这一点:通过但是我试图弄清楚它是否可能通过多态性。

GenreList将是具有不同类型列表的查找表(例如Punk,Pop,Metal)。 我已经回顾了Ryan Bate关于Polymorphic Assoiciations的截屏video,但我仍然被卡住了。 具体来说,我不确定如何创建多态表Genre,它将从GenreList模型(查找表)中提供jar装类型。

以下是否正确?

rails generate model Genre genre_list_id:integer genreable_id:integer genreable_type:string class Artist  :genreable end class Band  :genreable end class Genre  true end class GenreList < ActiveRecord::Base end 

我认为你的实现有点奇怪。 我这样做的方法是创建一个模型类型(它将保留所有可用的流派Punk,Rock,Metal等)。 然后我会做你已经完成的所有这些但没有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 

同样适用于乐队。 我希望我理解你的问题。 如果我帮忙,请告诉我!

好吧,在6.5小时后,我设法解决了这个问题。 我使用inherited_resources gem来帮助控制器。 回顾一下,我希望能够通过多态关系为艺术家和乐队添加类型,即Genre将是一个查找表,而Genreings将是包含艺术家和乐队类型的多态模型。 以下代码对我有用:

 # 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) 

它是正确的。 似乎缺少的一件事是从GenreList到Genre的has_many关系

 class GenreList < ActiveRecord::Base has_many :genres end