with_scopeでいいじゃん

Railscastを見直していて、自分の変な思い込みに気づきました。

class Task < ActiveRecord::Base
  def self.find_incomplete
    find(:all, :conditions => ["complete = ?", false])
  end
end

のfindのオプションを渡したい場合に

class Task < ActiveRecord::Base
  def self.find_incomplete(options = {})
    options = {:conditions => ["complete = ?", false]}.update(options || {})
    find(:all, options)
  end
end

みたいなことを書いてた。

class Task < ActiveRecord::Base
  def self.find_incomplete(options = {})
    with_scope options do
      find(:all, :conditions => ["complete = ?", false])
    end
  end
end

でいいじゃんね?with_scopeも結構つかってるのに何やってんだ俺。orz

プロジェクトのみんなゴメン。


あと、こんなことができることを初めて知った。

class Project < ActiveRecord::Base
  has_many :tasks
end
@project = Project.find(params[:id])
@tasks = @project.tasks.find_incomplete

なんでこうなるのか、よく分からんっす。

追記

まだこれのソース読んでないけど、たぶんArrayのインスタンスを何かでextendしたものを返すメソッドをhas_manyは作ってるような気がする。