Rails多态与查找表

时间:2011-02-07 23:05:25

标签: ruby-on-rails polymorphism

最好的方法是什么?我希望能够通过多态性给乐队和艺术家带来流派。我可以用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

3 个答案:

答案 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