2010-12-06 24 views
0

嘿傢伙 我是新來的rails,有很多令我大開眼界的東西,我寫了一些代碼,看起來沒有效率,我粘貼我的代碼如下,你能幫我找到寫這個更好的方法嗎?如何在rails中寫多對多的基本查詢

視頻表:

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

     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 :middle_name 
     t.string :last_name 
     t.string :nick_name 
     t.boolean :gender 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :drummers 
    end 
end 

,我將它們設置爲簡單許多-to-many關聯

class CreateDrummersVideosJoin < ActiveRecord::Migration 
    def self.up 
    create_table :drummers_videos, :id => false do |t| 
    t.integer "drummer_id" 
    t.integer "video_id" 
    end 
    end 


    def self.down 
    drop_table :drummers_videos 
    end 
end 

我想找到所有的標題鼓手名字是「Jojo」,姓氏是「Mayer」的視頻

我的代碼:

title = Drummer.where(:first_name => "Jojo", :last_name => "Mayer").first.videos.each {|t| t.title} 

此返回所有列的數據,而不是隻有標題我想

而且由於這裏只有一個名爲「喬喬邁耶」一個結果返回,但返回值是activeRelation ,我無法撥打視頻,所以我的工作就是使用:首先獲取視頻實例以調用視頻。我知道這絕對不是這樣做的

有什麼建議嗎?

回答

1

你需要在他們之間的連接表,就像你推斷。但是Rails中的連接表不需要在遷移中創建。它可以完全在模型中完成。

#drummer.rb 
belongs_to :drummer_videos, :polymorphic => true 
has_many :videos, :as => :drummer_videos 

#video.rb 
belongs_to :drummer_videos, :polymorphic => true 
has_many :drummers, :as => :drummer_videos 

確保drummer TABLEvideo TABLEdrummer_videos_id屬性。

然後,你可以打電話給你的鼓手..

Drummer.where(:first_name => "Jojo", :last_name => "Mayer").videos.each {|t| t.title} 
+0

這也是一個多對多的關聯嗎? – mko 2010-12-07 02:02:24

+0

嘿旅行,據我所知,只有兩種方式來做多對多的關係,你的解決方案似乎對我來說是新的,我在哪裏可以找到關於所有這個協會的參考,謝謝 – mko 2010-12-08 04:28:03

1

首先,如果你想只應該使用地圖或收集的,而不是每個視頻標題屬性,所以是這樣的:

Drummer.where(...).first.videos.map{ |t| t.title } 

甚至更​​短:

.map(&:title) 

其次,在我看來,如果你再盟友希望從一個鼓手對象獲得所有視頻,而不是像你一樣以某種方式使用第一個視頻,這是一個不錯的選擇。否則,如果您想根據特定標準獲取不同鼓手的所有視頻,那麼您應該直接調用視頻,然後加入或包含鼓手。也許是這樣的:

Video.joins(:drummers).where("drummers.first_name = 'jojo' AND drummers.last_name = 'Mayer'").map(&:title)