2010-05-02 2 views
0

У меня есть три модели:named_scope или find_by_sql?

  • пользователя
  • Award
  • Трофей

Ассоциации являются:

  • Пользователь имеет множество наград
  • Trophy имеет много наград
  • Award принадлежит пользователю
  • премии принадлежит трофею
  • Пользователю имеет много трофеев через награды

Поэтому user_id является Ф.К. в орденах, и trophy_id является Ф.К. в орденах.

В модели Trophy, которая является моделью STI, есть столбец trophy_type. Я хочу вернуть список пользователей, которым был присужден определенный трофей - (trophy_type = 'GoldTrophy'). Пользователи могут быть награждены одним и тем же трофеем более одного раза. (Я не хочу отличных результатов.)

Могу ли я использовать named_scope? Как насчет их цепочки? Или мне нужно использовать find_by_sql? В любом случае, как бы я его закодировал?

ответ

0

Я всегда комфортно с "find_by_sql" Вы можете использовать его Использование find_by_sql следующим

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'" 
       ) 

Я не уверен, что с помощью "named_scope" Но попробовать этот

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

Если вы хотите спуститься по маршруту named_scope, вы можете сделать следующее:

Добавить has_many: пользователям Trophy, такие как:

has_many :users, :through => :awards 

И следующий named_scope:

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

Вы можете позвонить следующее:

Trophy.gold.first.users 

Вам нужно позвонить " .first ', потому что named_scope вернет коллекцию. Не идеально. Тем не менее, в вашем случае, вероятно, вполне целесообразно использовать ни find_by_sql, ни named_scope. Как насчет использования старых добрых:

Trophy.find_by_trophy_type('GoldTrophy').users 

Это сделает то, что вы хотите, без необходимости выкапывать в SQL.

Смежные вопросы