2010-11-06 3 views
19

Il y a 2 modèles, et ils sont liés en utilisant une relation has_many: though.rails has_many: through - Est-il possible d'avoir une condition dans la table through?

Il existe le paramètre: conditions, qui recherchera une condition dans l'autre table de modèles, mais est-il nécessaire de créer une condition dans la table de jointure?

Par exemple, je supose:

User 
Game 
GameUser 

Un utilisateur peut avoir de nombreux jeux, comme un jeu peut avoir de nombreux utilisateurs. Mais je veux stocker des informations supplémentaires dans la table commune, par exemple si l'utilisateur aime ou non ce jeu.

Et je voudrais avoir un filtre de relation dans mon modèle d'utilisateur, quelque chose comme ceci:

has_many :games, :through => 'game_users' 
has_many :liked_games, :through => 'game_users', :conditions_join => { :like => true } 

Y at-il une jolie façon d'avoir cette fonctionnalité?

+1

double possible de [Rails a \ _many: par Recherche par Extra Attributs d'inscription dans le modèle] (http://stackoverflow.com/ questions/408872/rails-a-plusieurs-par-trouver-par-extra-attributs-dans-join-modèle) – DreadPirateShawn

+0

Semble être lié à cette question, qui a une bonne réponse => http://stackoverflow.com/ questions/408872/rails-a-plusieurs-par-trouver-par-extra-attributs-dans-join-modèle – Jochen

Répondre

18

Le lien de Jochen a une bonne solution - mais :conditions est déprécié et le bit :conditions => ['event_users.active = ?',true] ne semble pas très linéaire. Essayez ceci:

has_many :game_users 
has_many :game_likes, -> { where like: true }, class_name: 'GameUser' 
has_many :liked_games, :through => :game_likes, class_name: 'Game', :source => :game 
+0

Gardez à l'esprit que la réponse est à partir de 2009 (la réponse liée). ': conditions => ['event_users.active =?', true]' était la façon dont les choses ont été faites avant Rails 3. –

+1

Je ne critique pas, j'essaie juste de fournir une réponse à jour pour tous ceux qui trouvent leur chemin ici en cherchant un – msanteler

+1

il existe un moyen de le faire sans définir explicitement 'game_likes' ?, je veux dire juste avec des conditions sur' loved_games' –

7

Dans Rails 4 vous pouvez faire:

# app/models/user.rb 

has_many :liked_games, -> { where(like: true) }, class_name: "Game", 
    through: :game_users, source: :game 
+0

la question est de savoir comment créer un enregistrement avec cette condition en utilisant simple_form –

Questions connexes