Rails1.2.3 ActiveRecordのfindで:includeを使っていると:selectが効かない
前置き:もしかしてOracle限定かも。時間ができたらMySQLでも試してみます。
以下のmodelがあるとします。
class User < ActiveRecord::Base belongs_to :role end class Role < ActiveRecord::Base has_many :users end
例えばroles.levelが3以上の人数を数えたいとき
cnt = User.find( :first, :select => "count(*) as cnt", :include => :role, :conditions => "roles.level >= 3" ).cnt
とすると、'cnt'が'undefined method'だと怒られます。デバッグのSQLをみると'select * 'になってしまっているようです。このようなケースでは:joinsを使うとうまくいくようです。
cnt = User.find( :first, :select => "count(*) as cnt", :joins => "left join roles on roles.id = users.role_id", :conditions => "roles.level >= 3" ).cnt
これで無事件数を取得できます。:includeの指定時に集合関数が効かないのは、まぁそういうもんかなという気もしますが、それでも何とかしたい不条理な状況は往々にしてあるものなので、その点ActiveRecordは柔軟な対応ができてよいですね。最後にはfind_by_sqlがありますし。