1

コントローラからのコード+エラー:

def search_conditions
    conditions = []
    if !params[:player_name].nil? && !params[:player_name].empty?
      conditions << ["lower(players.name) LIKE ?", "#{params[:player_name].downcase}%"]
    end
    conditions
end

def index
    @games = Game.joins([:player_one, :player_two]).where(search_conditions)
end

undefined method `%' for ["lower(players.name) LIKE ?", "test%"]:Array
Stack Trace:
activerecord (3.2.6) lib/active_record/sanitization.rb:121:in `sanitize_sql_array'
activerecord (3.2.6) lib/active_record/sanitization.rb:28:in `sanitize_sql_for_conditions'
activerecord (3.2.6) lib/active_record/relation/query_methods.rb:324:in `build_where'
activerecord (3.2.6) lib/active_record/relation/query_methods.rb:136:in `where'
app/controllers/game_controller.rb:5:in `index'

スタックトレースを見て、アクティブなレコードソースを検索し、sanitize_sql_arrayメソッドで問題の原因となっている行を見つけることができました。

statement % values.collect { |value| connection.quote_string(value.to_s) }

今、私はその行が何をしているのかを正確に知るのに十分なルビーについて知りません。最初は文字列のパーセント記号に関係していると思いましたが、それを削除しても同じエラーが発生します。多次元配列を作成して文字列を完全に作成しようとしたこともありますが、それでも同じエラーが発生します。

4

1 に答える 1

4

where単なる配列ではなく、配列の配列をに渡します。これはstatement、配列として設定されることを意味しますが、文字列を想定しています(文字%列では、文字列の書式設定を行います。例:)"hello %s" % "world" => "hello world"

conditions = []
conditions << ["lower(players.name) LIKE ?", "#{params[:player_name].downcase}%"]

  => [ ["lower(players.name) LIKE ?", "..."] ] 

変化する:

conditions << ["lower(players.name) LIKE ?", "#{params[:player_name].downcase}%"]

に:

conditions.push "lower(players.name) LIKE ?", "#{params[:player_name].downcase}%"
于 2012-07-23T19:05:32.677 に答える