짧은 대답 인 조건에서 COUNT (*) 좋아하지 않았다 : 이들은 매우 DRY 아니다 그러나
Game.find(:all, :include => :players, :group => 'players.game_id',
:select => "games.*, COUNT(players.id) AS players_count",
:conditions => "players_count < games.num_players"
)
을 . 장기간에 걸쳐 관계를 카운터 캐시로 설정하는 것이 더 쉬울 수도 있습니다. 방법과 이유에 대한 자세한 내용은 railscast을 참조하십시오.
카운터 캐시 설정은 간단한 3 단계 프로세스입니다.
- 게임에 players_count 정수 열을 추가하십시오.
- 기존 게임 기록을 모두 players_count로 업데이트하십시오.
belongs_to :game
선언에 :counter_cache => true
을 추가하십시오.
다음 열려있는 모든 게임을 찾을 수 있습니다 :
Game.find(:all, :conditions => "games.players_count < games.num_players")
보너스 포인트를 명명 된 범위 것을 만들기 위해 :
class Game < ActiveRecord::Base
has_many :players
named_scope :open, :conditions => "games.players_count < games.num_players"
named_scope :type, lambda {|type|
{:conditions => {:type => type}}
}
named_scope :baseball, :conditions => {:type => "baseball"}
end
Game.open # => Returns all open games.
Game.baseball.open # => Returns all open baseball games.
Game.open.type("football") # => Returns all open foot ball games.