トップ «前の日記(2008-11-30) 最新 次の日記(2009-03-01)» 編集

3 日坊主日記


2009-02-20 [長年日記]

_ [Rails][MySQL] FOUND_ROWS

昔作ったRails appを2.1系まで上げていじっていたところ FOUND_ROWS() の値がおかしくなってることに気づいた 。

Customer Load (0.969000)  SELECT SQL_CALC_FOUND_ROWS * FROM customers WHERE (point >= '100' and shop_id = '2') ORDER BY code LIMIT 50
Customer Columns (0.015000)  SHOW FIELDS FROM `customers` # こいつめ
SQL (0.000000)  SELECT FOUND_ROWS()

testを書いてなかった……

Columns の取得は find_by_sql(sql) の中で instantiate(record) するときに行われる。 仕方ないので find_by_sql(sql) の実装を展開して対応してみた。

  def self.find_all_with_calc_found_rows(conditions = nil, orderings = nil, limit = nil, joins = nil)
    sql  = "SELECT SQL_CALC_FOUND_ROWS * FROM #{table_name} "
    sql << "#{joins} " if joins
    add_conditions!(sql, conditions)
    sql << "ORDER BY #{orderings} " unless orderings.nil?
    add_limit!(sql, :limit => limit)

    # ret = find_by_sql(sql)
    row = connection.select_all(sanitize_sql(sql), "#{name} Load")
    @found_rows = connection.select_one("SELECT FOUND_ROWS()")["FOUND_ROWS()"].to_i
    row.collect! { |record| instantiate(record) }
  end

  def self.found_rows
    @found_rows
  end
[]