2011-02-07 2 views
0

これを行う最も良い方法は何ですか?私は多様性によってバンドとアーティストのジャンルを伝えたいと思っています。私はhabtmとhas_manyでそれを行うことができます。しかし、多態性によって可能かどうかを調べようとしています。ルックアップテーブルを使用した多形式のレール

ジャンルリストは、さまざまなジャンルのリスト(例:Punk、Pop、Metal)を持つルックアップテーブルです。私はRyan Bateの多型的なAssoiciationsのスクリーンキャストを見直しましたが、私はまだ立ち往生しています。具体的には、GenreListモデル(ルックアップテーブル)から缶詰のジャンルを取得する多態型Genreを作成する方法がわかりません。

以下は正しいですか?

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

[OK]を6.5時間後、私はこれを把握することができました。私はコントローラーを助けるためにinherited_resources gemを使用しました。要約すると、私は多形性関係を通じてアーティストやバンドのジャンルを追加できるようにしたかった、すなわち、ジャンルは、ルックアップテーブルとなり、そして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) 
0

正しいです。欠けているように見えることの一つは、私はあなたの実装が少し奇妙だと思う

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

ステファン、これはありがたいことです。今私はビューとコントローラを実際に動作させるためにソートしようとしています。 – face7hill

1

をジャンルにGenreListからhas_manyの関係です。私がやる方法は、モデルジャンル(パンク、ロック、メタルなど、すべてのジャンルを収録)を作成することです。その後、私はあなたがすでに行われたが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を参照整合性のためにそれ自身のテーブルに保つよう努めています。私はgenre_list_idsをポリモーフィックテーブルに保存したいだけです。これは、私が予想していたよりもやわらかくなり始めています。基本的には、アーティストやバンドを追加/編集するときに、そのジャンルをチェックして、そのジャンルの多態表にそのジャンルを保存したいと思っています。私はそれが単純化するのに役立つかどうかを見るためにinherited_resourcesを見ています。進歩を遂げると私は結果を掲示します。ありがとう! – face7hill

関連する問題