読者です 読者をやめる 読者になる 読者になる

有効なユーザーだけをfindするメソッドfind_activeを定義してみる

Rails Ruby

モデルが以下のようになっていて、削除フラグと未表示フラグの2つがあるとします。

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table "users", :force => true do |t|
      t.column :login,                     :string
      t.column :email,                     :string
      t.column :age,                       :integer
      t.column :deleted,                   :boolean, :default => false
      t.column :hidden,                    :boolean, :default => false
    end
  end
  def self.down
    drop_table "users"
  end
end

こんな感じのときに有効なユーザーの一覧を出すには

users=User.find(:all,:conditions=>["deleted = ? and hidden = ?",false,false])

とかってやりますよね。
んで、いちいち:conditionsを書くのはやってらんねーって人は

User.with_scope(:find=>{:conditions=>["deleted = ? and hidden = ?",false,false]}) do
  users=User.find(:all)
end

とかって書くわけです。
んでも、私はwith_scopeすら書きたくないのです。
findの代わりにfind_activeを使いたいのです。
それで、定義

class User < ActiveRecord::Base
  def self.find_active(*value)
    User.with_scope(:find=>{:conditions=>["deleted = ? and hidden = ?",false,false]}) do
      User.find(*value)
    end
  end
end

このように定義しておくと、

users=User.find_active(:all)
users=User.find_active(:all,:conditions=>["age = 30"])
user=User.find_active(:first,:conditions=>["login = taro"])

というふうにfindと同じオプションが使えてしまいます。
使いやすいですね。