2010-12-10 8 views
0

私は今日の午後m:m関連を形成するために両方のテーブルでt 1:m関連付けを使用できないのはなぜですか?

このアイデアを考えていた、レールに新たなんだが、ここに私のコードです:

ビデオテーブル移行ファイル:

class CreateVideos < ActiveRecord::Migration 
    def self.up 
    create_table :videos do |t| 
     t.string :title 
     t.string :drummer_id 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :videos 
    end 
end 

ドラマーテーブル移行ファイル:

class CreateDrummers < ActiveRecord::Migration 
    def self.up 
    create_table :drummers do |t| 
     t.string :first_name 
     t.string :video_id 
     t.timestamps 
    end 
    end 

def self.down drop_table:ドラマー end 最後

drummer.rb

class Drummer < ActiveRecord::Base 
belongs_to :video 
has_many :videos 
end 

video.rb

クラスのビデオ<はActiveRecord ::ベース にhas_manyは:私の知る限り

を知っているようにドラマー エンド

: belongs_toのがドラマー

Drummer.create(:first_name => "Jojo") 

Drummer.find_by_first_name("Jojo").videos.create(:title => "JojoVideo1") 

それはいいです

しかし、反対側に 、何もありません!

Video.find_by_title("JojoVideo1").drummers 
=>[] 

私はすべての一致する外部キーをチェックしますが、上記のクエリが空の配列を返すかどうかわかりません。

答えて

1
> Drummer.all 
=> [#<Drummer id: 1, first_name: "Jojo", video_id: nil, created_at: "2010-12-10 11:04:48", updated_at: "2010-12-10 11:04:48">] 
> Video.all 
=> [#<Video id: 1, title: "JojoVideo1", drummer_id: "1", created_at: "2010-12-10 11:04:48", updated_at: "2010-12-10 11:04:48">] 
> Video.all.first.drummer 
=> #<Drummer id: 1, first_name: "Jojo", video_id: nil, created_at: "2010-12-10 11:04:48", updated_at: "2010-12-10 11:04:48"> 
> Video.all.first.drummers 
=> [] 

とテスト/ development.logから:それはその後、彼らのドラマーIDをチェックするビデオに行くことによって発見されたので、

Video Load (0.3ms) SELECT "videos".* FROM "videos" 
    Drummer Load (0.3ms) SELECT "drummers".* FROM "drummers" WHERE ("drummers"."id" = 1) LIMIT 1 
    Video Load (0.3ms) SELECT "videos".* FROM "videos" 
    Drummer Load (0.3ms) SELECT "drummers".* FROM "drummers" WHERE ("drummers".video_id = 1) 

Video.all.first.drummerは、動作します。もう1つは、video_idでドラマーを見つけようとしているため、ドラマーのvideo_idを設定していないため、ビデオが作成されませんでした。

我々は逆の問題でビデオ/ドラマーのペアを構築することができます。新しい動画がなく、不十分ドラマーのために、ドラマーのためによく動作することを

d = Drummer.first 
d.create_video(:title => "JojoVideo2") 
d.save 

- この時間ので、ドラマーはVIDEO_IDを持っていますが、ビデオは持っていドラマーなし。

の実用的な結論としては、あなたがのRohitが言った何をすべきということです:)

+0

ねえ、あなたは男です!今私はなぜそれが動作しません。そして、私にログファイルをチェックする方法を教えてくれてありがとう、そこにはたくさんの情報があります。今は、SQLクエリーをチェックして、何が起こっているのかを知っています。 – mko

1

あなたのコードで何が間違っているのか分かりません。しかし、別の方法を提案したいと思います。あなたは多対多の関連を処理する結合モデルを作成することができます。結合モデルを使用すると、コードをより詳細に制御できます。これは以下のように行うことができる。

class CreateAs < ActiveRecord::Migration 
    def self.up 
    create_table :as do |t| 
     t.string :title 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :as 
    end 
end 


class CreateBs < ActiveRecord::Migration 
    def self.up 
    create_table :bs do |t| 
     t.string :title 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :bs 
    end 
end 


class CreateCs < ActiveRecord::Migration 
    def self.up 
    create_table :cs do |t| 
     t.references :as 
     t.references :bs 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :cs 
    end 
end 

以下として

class A < ActiveRecord::Base 
has_many :cs 
has_many :bs, :through => cs 
end 

class B < ActiveRecord::Base 
has_many :cs 
has_many :as, :through => cs 
end 

class C < ActiveRecord::Base 
belongs_to :as 
belongs_to :bs 
end 

と各モデルの移行別の方法の周りにだけモデルなしで結合テーブルを作成することです。これは、することによって行うことができます: -

クラス<はActiveRecord ::ベース がhas_and_belongs_to_manyアソシエーション:BS エンド

クラスB <はActiveRecord ::ベース has_and_belongs_to_manyアソシエーション: エンドとして

は、あなたがより良いを持っている願っていますアイディア。

+0

ねえのRohit、どのように結合テーブルを使用することにより、多対多の関連付けを行うために私を示すためのおかげで、私はすでにそれを知っているが、おかげでどんな形にでも – mko

関連する問題