2010-12-06 16 views
0

こんにちは、 私はレールが初めてです。私にとっては目が開かれていて、コードを書くと効率が悪いようです。私のコードは、あなたが私にこれを書くためのより良い方法を見つけるのを助けることができます。多対多ベースのこのクエリーをレールに書く方法

動画テーブル:

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 

と私はすべてのタイトルを検索する簡単な多対多の関連を

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} 

この戻り、すべての列のデータではなく、私が欲しいだけタイトル

、そこに「ジョジョ・メイヤー」という名前の1つの結果だけリターンです、しかし、戻り値は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 TABLE drummer_videos_id属性を持っていることを確認します。

次に、あなたがあなたのドラマーを呼び出すことができます。..

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

これは多かれ少なかれ関連性ですか? – mko

+0

ちょっと旅行、私は多対多の関係を行うための2つの方法を知っている限り、あなたの解決策は私には新しいようだ、どこにこの協会についての参考文献を見つけることができます、ありがとう – mko

+0

それに素晴らしいrailscastはhttp ://railscasts.com/episodes/154-polymorphic-association – Trip

1

まず第一に、あなたがビデオからのみtitle属性を取得したい場合は、代わりに、それぞれのマップを使用するか、収集する必要がありますので、このような何か:

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

または短いさえ:

.map(&:title) 

第二に、あなたが再場合ように私には思えます一人のDrummerオブジェクトからすべてのビデオを取得したいと思っています。何らかの方法で最初のものを使用するのと同じように、あなたのように、かなり良い選択です。

他のドラマーのすべてのビデオを一定の基準で取得したい場合は、おそらくビデオを直接呼び出してから、ドラマーに参加するか含めてください。おそらくこのように:

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

ダン、あなたはいいです!あなたは私にいくつかのレールツァットや他の学習教材をお勧めできますか?おかげで – mko

+0

ありがとう!私は約1年前にRoRから始めました。最初は、グーグルのRuby on Railsチュートリアルで得た百万の結果の1つをたどりました。しかし、私が進歩するにつれて、私にとって最高のアイデアは、ここでStackOverflowを見て、他の人が何を求めているのか、彼らが得た答えを見ていたことに気付きました。 – DanneManne

+0

すばらしい、あなたの経験を共有してくれてありがとう – mko

関連する問題