【问题标题】:named scope based on number of associated records基于关联记录数的命名范围
【发布时间】:2012-02-26 09:24:12
【问题描述】:

我正在做一些基本的 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,但我也会接受依赖较新版本的解决方案。

【问题讨论】:

    标签: ruby-on-rails scope group-by has-many-through record-count


    【解决方案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

    【讨论】:

    • 啊,我明白了。很高兴我能帮助你。我绝对同意使用 joins() 从代码中获取该 sql,但对于示例,我认为我会将其保留在那里以保持一致性,因为其他键非常依赖于 sql。 :-) -md
    猜你喜欢
    • 2022-12-18
    • 2014-12-30
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多