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

:groupとfriendsを使用して、returning_membersメソッドをスコープとして書き直すことはできますか?

Rails 2.3を使用していますが、新しいバージョンに依存するソリューションも受け入れます。

4

1 に答える 1

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

確認済み:Rails3.1.3およびSQLite3

于 2012-02-03T21:07:04.310 に答える