2012-02-03 11 views
0

いくつかの基本的なSQLロジックを実行しています。名前付きスコープを使用したいと思います。私はシーズンの何人のメンバーが他のシーズンにも参加していることを知りたいと思います(メンバーを返すなど)。関連するレコードの数に基づいた名前付きスコープ

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 

グループとフレンドリーは、returning_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 

:Railsの3.1.3とSQLite3の

+0

ああ、私は参照してください。お役に立てて嬉しいです。私は間違いなくジョインズ()でコードからSQLを取得することに同意しますが、例では、他のキーがかなりSQLに依存していたので、一貫性のためにそこに残すと考えました。 :-) -md – miked

関連する問題