named_scope или find_by_sql? - PullRequest
       20

named_scope или find_by_sql?

0 голосов
/ 02 мая 2010

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

  • Пользователь
  • Приз
  • Трофи

Ассоциации:

  • У пользователя много наград
  • Трофей имеет множество наград
  • Премия принадлежит пользователю
  • Награда принадлежит трофею
  • У пользователя много призов за награды

Следовательно, user_id - это fk в наградах, а trophy_id - это fk в наградах.

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

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

Ответы [ 2 ]

1 голос
/ 02 мая 2010

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

Добавление has_many: users в 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.

0 голосов
/ 02 мая 2010

Мне всегда комфортно с "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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...