0

Я занимаюсь базовой логикой sql, и я хочу использовать именованный scope. Я пытаюсь выяснить, сколько участников сезона участвовали в другом сезоне (т. Е. Они возвращают членов).Именованная область, основанная на числе связанных записей

class Season 
    has_many :season_members 
    has_many :users, :through => :season_members 

    def returning_members 
    users.select { |u| u.season_members.count > 1 } 
    end 
end 

class SeasonMember 
    belongs_to :season 
    belongs_to :user 
end 

class User 
    has_many :season_members 
end 

Возможно ли использовать группу и друзей, чтобы переписать метод возвращаемых_members как область действия?

Я использую Rails 2.3, но я также принимаю решения, которые полагаются на более новые версии.

ответ

1

Не уверен, что вы действительно хотите поместить эту область в Сезон, так как это будет означать, что вы ищете сезоны, в которых есть повторяющиеся пользователи. Но, я полагаю, вы хотите, чтобы пользователи повторяли сезоны. С этого предположения, ваша сфера будет:

class User < ActiveRecord::Base 
scope :repeat_members, 
    :select=>"users.*, count(season_members.season_id) as season_counter", 
    :joins=>"JOIN season_members ON season_members.user_id = users.id", 
    :group=>"users.id", 
    :having=>"season_counter > 1" 
end 

, который приведет в следующем запросе:

SELECT users.*, count(season_members.season_id) as season_counter FROM "users" JOIN season_members ON season_members.user_id = users.id GROUP BY users.id HAVING season_counter > 1 

Подтвержденные с: Рельсы 3.1.3 и SQLite3

+0

Ах, я вижу. Рад, что смог помочь. Я определенно согласен с получением этого sql из кода с помощью joins(), но для примера я решил, что оставил бы его там для обеспечения согласованности, поскольку другие ключи были довольно зависимыми от sql. :-) -md – miked

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