2010-12-10 74 views
0

我新的軌道,我在想這個想法在今天下午爲什麼我不能在兩個表中使用t 1:m關聯來形成m: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:drummers end 結束

drummer.rb

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

video.rb

類視頻<的ActiveRecord :: Base的 的has_many:鼓手 belongs_to的:鼓手 結束

據我所知

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

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

沒關係

但是 在另一邊,沒什麼!我不知道上面的查詢返回的是空數組。

回答

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:

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的作品,因爲它是由將視頻,然後檢查他們的鼓手ID找到。另一個不起作用,因爲它試圖找到帶有video_id的鼓手,而我們創建視頻的方式並未設置鼓手的video_id。

我們可以構造出一個視頻/鼓手對有相反的問題:

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

這種新的視頻鼓手錶現良好,但不好的鼓手 - 因爲這個時候,鼓手有VIDEO_ID但視頻有沒有drummer_id。

它的實際結果是,你應該做的羅希特說:)

+0

hey lain,你是男人!現在我爲什麼不行。並感謝您向我展示如何檢查日誌文件,那裏有很多信息,現在我檢查sql查詢以瞭解引擎蓋下發生了什麼 – mko 2010-12-11 05:15:35

1

我不知道你的代碼有什麼問題。但我想提出另一種解決方法。你可以創建一個連接模型來處理你的多對多關聯。使用連接模型可以更好地控制代碼。這可以按以下步驟進行:

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 

和如下

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 

另一種解決辦法是通過只創建一個連接表沒有一個模型每個模型的遷移。這可以這樣做: -

A級<的ActiveRecord :: Base的 has_and_belongs_to_many:BS 結束

B類<的ActiveRecord :: Base的 has_and_belongs_to_many:作爲 結束

希望你有一個更好的理念。

+0

嘿羅希特,謝謝你向我展示瞭如何使用連接表做很多-to-many關聯,我已經知道了,但謝謝任何方式 – mko 2010-12-11 05:06:16

相關問題