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

确认:Rails 3.1.3 和 SQLite3

于 2012-02-03T21:07:04.310 回答