またも謎のcountメソッド。

発注済の物品情報をカウントしましょう、というメソッド。

  def self.count_pending
    count("checked_at is null")
  end

これがサイトに載っていたんですが、このまま書くとログイン時に(このメソッドを実行する時に)エラーが出ます。


ActiveRecord::ActiveRecordError: ?????: Encountered "is" at line 1, column 25?: SELECT count(checked_at is null) AS count_checked_at_is_null FROM orders


countメソッドの引数に関して文句を言われているようです。
このメソッドはSQLの件数を数えるっていうことですから、多分文字列を唐突に与えられてもどーしろと、という話なんではなかろーか、ということで。
取り敢えず問題の部分をコメントアウトで消してみる。つまり、count_pendingメソッドは空ということです。
ログイン時のエラーは出なくなりましたが、表示に不十分な点が。

…作業BGMのところは、まあ、スルースルー(因みに懐かしのヴィジュアル系的なものを聴いてました。ときめく)。
発注の件数というところは正しい数値が入っているんですが、確認待ちの件数というところが空欄になっています。
ここに当てはめていた変数は、app/controller/login_controller.rbで書いてます。

class LoginController < ApplicationController

  layout "articles"

  def index
    @total_orders = Order.count
    @pending_orders = Order.count_pending
  end

前述のcount_pendingメソッドの中身が空欄なので、ここに入るべき数値もないってことですな。
という訳で、やっぱりcount_pendingメソッド内のcountに何かよさげなもんを与えてやらなきゃ。
さて、何がいいかなと。直前に同じ文字列をcondotionsオプションで与えてるfindメソッドがあったので、それを真似してみました。

  def self.count_pending
    count(:all, :conditions => "checked_at is null")
  end

:all…全部カウントするってことでしょうが…
駄目なら別のものを入れてみよう、取り敢えず実行だ。

ログインします。

あ、出た。
因みに数字的にも合ってます。
取り敢えずはこれで良さそうです。
でも仕組みがいまいちわかってません…allでいいのか…
後々不具合が出るかもですが、取り敢えず、先に進みます。




Ruby on Rails2.0 チュートリアル 「Webアプリケーション開発方法」
〜物品管理フォームでのユーザ管理〜