モデルの参照系

  • 単にテーブルの全件取得なら、allでOK
    @books = Book.all
    
  • 検索の基本は、findね!
    @books = Book.find([1, 2, 3])
    
    • findは、テーブルキーのid指定での検索ね
    • Rails2ではfindになんでも詰め込む方針だったけど、Rails3では別メソッドになって大きく方針転換したので注意!
    • find_by_xxxxx は、検索キー指定で1件だけ返す
      @book = Book.find_by_publish(検索キー)
      
    • find_all_by_xxxxx は、検索キー指定で複数件返す
      @books = Book.find_all_by_publish('会社名')
      
    • 更に、_and_カラム名でandも指定可能!
      @books = Book.find_all_by_publish_and_cd('会社名',true)
      
  • 複雑な条件検索は、クエリメソッドで。
    • 要するにSQLっぽいメソッドで、こんな感じで!
      @books = Book.where(:publish => '会社名').order('published DESC')
      
    • whereは、ハッシュ形式以外にもプレスフォルダ(名前付きもOK!)も可能なんだ!
      @books = Book.where('publish = ? AND price = ?', param[:publish], param[:price])
      @books = Book.where('publish = :publish AND price = :price', (:publish => param[:publish], :price => param[:price]))
      
    • orderは普通にソートね。
    • selectは、カラムを指定。これ使わない場合は、*になる。んでもって、これでDISTINCTも書ける
      @books = Book.select('DISTINCT publish,title')
      
      • うーん、カラム指定は、全てを1つの文字列として書くのか…。うーん、この仕様は…、微妙ー
    • limit/offsetで、特定範囲を取得
      @books = Book.order('published').limit(3).offset(2)
      
      • む!これだと、Oracleはどうなるんだろ?使えない、とか?→うーん、対応DBには入ってるのかー。後で調べてみよう!
      • おー、これを使うとページングが超簡単!(record/page/2 みたいにアクセスね)
         def page
           page_size = 3
           page_num = params[:id] == nil ? 0 : params[:id].to_i - 1
           @books = Book.order('published').limit(page_size).offset(page_num * page_size)
           render 'hello/list'
         end
        
    • first/lastで、先頭行/最終行を取得。これは、limit不要で最後に書くこと!
    • groupやhavingもあるよー。ま、この辺は必要な時に調べるってことで。
    • うーん、likeは微妙だー
      • 結局、こんな感じでしか書けないのか?後でまた調査!
        noticeMails = NoticeMail.where('"to" like ?', "%#{user.email}%")
        
      • 特に、カラムを"to"みたいにダブルクォートで囲まないとまずいのがなんとも。あ、でもこれはSQLiteの制限か?
  • その他の取得系
    • exits?は、レコードの有無をチェック!
    • scopeで、名前付きスコープ。これはいいね!
      • まずは、Bookモデルクラスでこんな感じで定義
         scope :older, order('published ASC')
         scope :older5, older.limit(5)
        
      • で、コントローラ側でこう書けば、古いほうから5件取得できるんだねー
         def scope
           @books = Book.older5
           render 'hello/list'
         end
        
      • あ、ラムダ式を使って、scopeのパラメタ化も可能なんだ。すげー
      • default_scopeで、モデルのデフォルト指定も可能かー。order/whereは個別指定の場合は、これの後ろに追加されるみたい。
      • きっと、実際にはコントローラで書くんじゃなくて、これがいい気がするな。
    • countは、件数取得ね
    • 集計メソッドもあるよ。
      • average:平均
      • minimum:最小
      • maximum:最大
      • sum:合計
      • これ、groupと一緒に使うこともできるみたいだけど、非推奨…。まあ、ここまで頑張ってても、戻りがハッシュじゃな…。
    • find_by_sqlで、SQLを直に発行もできる…。けど、これやるのは、最後だよね…。

-
最終更新:2012年06月11日 07:58