2013-04-25 16 views
19

私はこれに関する複数の質問を読んだが、私の状況に適した答えはまだ見つけていない。 AppsAppsGenresここでGenreshas_many:through外部キー?

がそれらのそれぞれから適切なフィールドです:

は、私は3つのモデルを持っている

Apps 
application_id 

AppsGenres 
genre_id 
application_id 

Genres 
genre_id 
ここで重要なのは、私が ない idフィールドを使用しているということです

それらのモデルから。

application_idgenre_idフィールドに基づいてテーブルを関連付ける必要があります。

は、ここで私は、現在持っているものだが、それは私が必要とするクエリになっていない:参考のため

class Genre < ActiveRecord::Base 
    has_many :apps_genres, :primary_key => :application_id, :foreign_key => :application_id 
    has_many :apps, :through => :apps_genres 
end 

class AppsGenre < ActiveRecord::Base 
    belongs_to :app, :foreign_key => :application_id 
    belongs_to :genre, :foreign_key => :application_id, :primary_key => :application_id 
end 

class App < ActiveRecord::Base 
    has_many :apps_genres, :foreign_key => :application_id, :primary_key => :application_id 
    has_many :genres, :through => :apps_genres 
end 

を、ここで私は最終的に必要とするクエリです:UPDATED

@apps = Genre.find_by_genre_id(6000).apps 

SELECT "apps".* FROM "apps" 
    INNER JOIN "apps_genres" 
     ON "apps"."application_id" = "apps_genres"."application_id" 
    WHERE "apps_genres"."genre_id" = 6000 
+1

は、あなたが今どのようなSQLを得ているの? – Rebitzele

答えて

32

試してみてください:

class App < ActiveRecord::Base 
    has_many :apps_genres, :foreign_key => :application_id 
    has_many :genres, :through => :apps_genres 
end 

class AppsGenre < ActiveRecord::Base 
    belongs_to :genre, :foreign_key => :genre_id, :primary_key => :genre_id 
    belongs_to :app, :foreign_key => :application_id, :primary_key => :application_id 
end 

class Genre < ActiveRecord::Base 
    has_many :apps_genres, :foreign_key => :genre_id 
    has_many :apps, :through => :apps_genres 
end 

クエリ:

App.find(1).genres 

それは生成します。

SELECT `genres`.* FROM `genres` INNER JOIN `apps_genres` ON `genres`.`genre_id` = `apps_genres`.`genre_id` WHERE `apps_genres`.`application_id` = 1 

と問合せ:

Genre.find(1).apps 

を生成します。

SELECT `apps`.* FROM `apps` INNER JOIN `apps_genres` ON `apps`.`application_id` = `apps_genres`.`application_id` WHERE `apps_genres`.`genre_id` = 1 
+0

これは、アプリのすべてのジャンルを返します。私はジャンルのすべてのアプリが必要です。 – Shpigford

+0

さて、コードを更新しました –