2009-07-24 9 views
4

私は、ActiveRecordを使用するための作業をしている従来のデータベースを持っています。私は、結合テーブルの問題に遭遇しました。 idShow、idEpisodeは、だから私は2つのテーブルを持っており、それらの間(多くの関係に非常に多くの)に参加、しかし参加:その後、私は2つのフィールドを持つテーブルと呼ばれるtvshowlinkepisodeがいるActiveRecordレガシーデータベースの結合テーブル

class TvShow < ActiveRecord::Base 

    set_table_name "tvshow" 
    set_primary_key "idShow" 

end 

class Episode < ActiveRecord::Base 
    set_table_name "episode" 
    set_primary_key "idEpisode" 
end 

そして:私は、次の持っています非標準の外部キーを使用します。私の最初の考えは、TvShowEpisodeLinkというモデルを作成することでしたが、主キーはありません。その考えは、外部キーが非標準であるので、私はset_foreign_keyを使用して何らかの制御を行うことができたということでした。最終的には、TvShow.find(:last).episodesやEpisode.find(:last).tv_showのようなものを言いたいと思います。どうやってそこまで行くの?

答えて

8

私は、あなたの答えが完全にうまくいて、あなたのクラスのどのクライアントにとっても全く同じ機能をもたらすが、あなたはhas_and_belongs_to_manyというオプションを使って、Alvaroの答えよりややエレガントになると信じている。

class TvShow < ActiveRecord::Base 

    set_table_name "tvshow" 
    set_primary_key "idShow" 
    has_and_belong_to_many :episodes, 
         :join_table => "tvshowlinkepisode", 
         :foreign_key => "idShow", 
         :association_foreign_key => "idEpisode" 

end 

class Episode < ActiveRecord::Base 
    set_table_name "episode" 
    set_primary_key "idEpisode" 
    has_and_belongs_to_many :tv_shows, 
          :join_table => "tvshowlinkepisode", 
          :foreign_key => "idEpisode", 
          :association_foreign_key => "idShow" 
end 

こと注:association_foreign_keyは「向こう側」のクラスのためのIDである列を指定しています。一方、FOREIGN_KEYオプションは、リンクの「こちら側」のクラスのためのIDである列を指定しますリンクの

これは、Alvaroの答えとは対照的に、このパターンは、リンクを表すための不要なオブジェクトのインスタンス化を避ける必要があります。

+0

私はエピソードは多くのものではなく、1つの特定のテレビ番組だけに属すると思うだろう。 – txwikinger

+0

私はそれも@txwikingerだと思っていますが、その例では、ショーがそれぞれのシリーズの両方でいつかスピンオフシリーズを持っていれば、2人が一緒になるエピソードがあるかもしれないと思います。とにかく、誰かのデータベースがactiverecordを通じて論理的な意味を持つようにするのは面白いことです。 – nixterrimus

0

関係は1対多であるため、テーブルでbelongs_to/has__many関係を使用する必要があります。データベースにビューがある場合は、非標準の外部キーをテーブルのビューで隠すことができます。

あなたが必要とするものが100%合っているかどうかはわかりませんが、少なくともあなたにはわかります。これにより

+0

興味深い考えです。以前はデータベースビューで作業していませんでした。私はデータベースについて何かを変更する能力がないので、ここでデータベースビューが機能するかどうかはわかりません。 has_and_belongs_to_many関係の主題について、非標準プライマリキーを使用している場合、それは崩れませんか?私は、第三のモデルを使用することによって、has_and_belongs_to_many_through関係を行うことができると思いました。 – nixterrimus

+0

上記のレスポンスで非標準のforeign in keyを作成します:has_and_belongs_to_many関係の主題で、非標準の* foreign *キーがあると、それは崩れませんか? – nixterrimus

+0

@nixterrimus、right、thanks – txwikinger

4

この仕事はあなたのために...

class TvShow < ActiveRecord::Base 
    set_table_name "tvshow" 
    set_primary_key "idShow" 

    has_many :tv_show_link_episode, :foreign_key => 'idShow' 
    has_many :episodes, :through => :tv_show_link_episode 
end 


class Episode < ActiveRecord::Base 
    set_table_name "episode" 
    set_primary_key "idEpisode" 

    has_many :tv_show_link_episode, :foreign_key => 'idEpisode' 
    has_many :tv_shows, :through => :tv_show_link_episode 

end 

class TvShowLinkEpisode < ActiveRecord::Base 
    set_table_name "tvshowlinkepisode" 

    # the foreign key is named by the TvShowLinkEpisode field, 
    # the primary key name is for the primary key of the associated class 
    belongs_to :tv_show, :foreign_key => 'idShow' 
    belongs_to :episode, :foreign_key => 'idEpisode' 
end 
+0

+1、これは私にはうまく見える – marcgg

0

、あなたが実際に、テーブルが、それは「Railsの道」ではありません見て、

はこれを試してみてください、テーブルビューを設定する必要はありません。

>> TvShow.find(1).episodes 
#=> returns an array with [#<Episode idEpisode: 1, test: "Episode 1">] 

>> Episode.find(1). tv_shows 
#=> returns an array with [#<TvShow idShow: 1, test: "tvshow 1">] 

その後、あなたのようないくつかのものを行うことができます。

e = Episode.find(1) 
TvShow.find(1). episodes << e 
#=> this make the proper association