2012-02-03 68 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 

是否有可能使用:組和朋友重寫returns_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

啊,我明白了。很高興我能幫上忙。我絕對同意用join()從代碼中獲取該sql,但對於這個例子,我想我會將它保留在那裏以保持一致性,因爲其他鍵很依賴於sql。 :-) -md – miked 2012-02-09 17:26:45