2009-11-20 3 views
0

나는 플레이어 슬롯이 열려있는 게임 인 '공개'게임을 찾으려고합니다. 게임은 해당 게임의 최대 플레이어 용량을 나타내는 num_players으로 생성됩니다.조인 된 테이블의 개수 조건을 사용하여이 조인을 구성하는 방법은 무엇입니까?

게임 have_many 선수.

나는 다음과 같은

Game.find(:all, :include => :players, :group => 'players.game_id', :conditions => ['players.count(*) < games.num_players']) 

시도하지만

답변

2

짧은 대답 인 조건에서 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 단계 프로세스입니다.

  1. 게임에 players_count 정수 열을 추가하십시오.
  2. 기존 게임 기록을 모두 players_count로 업데이트하십시오.
  3. 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. 
관련 문제