最好的方法是什么?我希望能够通过多态性给乐队和艺术家带来流派。我可以用habtm和has_many来实现:通过但是我试图通过多态来弄清楚它是否可能。
GenreList将是具有不同类型列表的查找表(例如Punk,Pop,Metal)。我已经回顾了Ryan Bate关于Polymorphic Assoiciations的截屏视频,但我还是被卡住了。具体来说,我不确定如何创建多态表Genre,它将从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
答案 0 :(得分: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
同样适用于乐队。我希望我理解你的问题。如果我帮忙,请告诉我!
答案 1 :(得分:1)
好的,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)
答案 2 :(得分:0)
这是对的。似乎缺少的一件事是从GenreList到Genre的has_many关系
class GenreList < ActiveRecord::Base
has_many :genres
end