He leído varias preguntas acerca de esto, pero todavía tienen que encontrar una respuesta que funcione para mi situación.

Tengo 3 modelos: Apps, AppsGenres y Genres

Aquí están las áreas pertinentes de cada una de esas:

Apps
application_id

AppsGenres
genre_id
application_id

Genres
genre_id

La clave aquí es que estoy no el uso de la id campo de los modelos.

Necesito para asociar las tablas en función de los application_id y genre_id campos.

Aquí es lo que he actualmente tengo, pero no me la consulta necesito:

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

De referencia, esta es la consulta que en última instancia, la necesidad de:

@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
  • Lo SQL están recibiendo ahora?
InformationsquelleAutor Shpigford | 2013-04-25

1 Comentario

  1. 41

    ACTUALIZADO Intente esto:

    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

    Con consulta:

    App.find(1).genres

    Que genera:

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

    Y consulta:

    Genre.find(1).apps

    genera:

    SELECT `apps`.* FROM `apps` INNER JOIN `apps_genres` ON `apps`.`application_id` = `apps_genres`.`application_id` WHERE `apps_genres`.`genre_id` = 1
    • Que devuelve todos los géneros para una aplicación. Necesito todas las aplicaciones de género.
    • Ok, he actualizado el código

Dejar respuesta

Please enter your comment!
Please enter your name here