2010-05-02 6 views
0

J'ai trois modèles:named_scope ou find_by_sql?

  • utilisateur
  • Prix
  • Trophy

Les associations sont:

  • L'utilisateur a de nombreux prix
  • Trophy nombreux prix
  • Award appartient à l'utilisateur
  • Award appartient au trophée
  • utilisateur a beaucoup de trophées par prix

Par conséquent, user_id est un fk en prix et trophy_id est un fk en prix.

Dans le modèle Trophy, qui est un modèle STI, il existe une colonne trophy_type. Je veux retourner une liste d'utilisateurs qui ont reçu un trophée spécifique - (trophy_type = 'GoldTrophy'). Les utilisateurs peuvent recevoir le même trophée plus d'une fois. (Je ne veux pas de résultats distincts.)

Puis-je utiliser un named_scope? Pourquoi ne pas les enchaîner? Ou dois-je utiliser find_by_sql? De toute façon, comment pourrais-je le coder?

Répondre

0

Je suis toujours à l'aise avec le "find_by_sql" Vous pouvez l'utiliser En utilisant find_by_sql comme suit

User.find_by_sql("select u.id, u.name, t.trophy_type 
        from users u, awards a, trophies t 
        where a.user_id=u.id and 
        t.trophy_id=a.id and 
        t.trophy_type = 'GoldTrophy'" 
       ) 

Je ne suis pas sûr en utilisant "named_scope" Mais essayez cette

class User < ActiveRecord::Base 

    named_scope :gold_trophy_holder, 
       :select=>" users.id, users.name, trophies.trophy_type",  
       :joins => :awards, "LEFT JOIN awards ON awards.id = trophies.award_id" 
       :conditions => ['trophies.trophy_type = ?', 'GoldTrophy'] 

end 
1

Si vous voulez aller dans le sens de named_scope, vous pouvez effectuer les opérations suivantes:

Ajouter un has_many: les utilisateurs Trophy, tels que:

has_many :users, :through => :awards 

Et le named_scope suivant:

named_scope :gold, :conditions => { :trophy_type => 'GoldTrophy' } 

Vous pouvez appeler:

Trophy.gold.first.users 

Vous devez appeler ' .first 'parce que named_scope retournera une collection. Pas idéal. Cela dit, dans votre cas, il est probablement parfaitement approprié de n'utiliser ni find_by_sql ni named_scope. Que diriez-vous en utilisant le bon vieux:

Trophy.find_by_trophy_type('GoldTrophy').users 

Cela va faire exactement ce que vous voulez sans avoir à creuser dans le SQL.

Questions connexes