20

Sequel で生の SQL クエリを実行する適切な方法については、まだ明確ではありません。

現在、私はこれを試しています:

DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") do |row|
 @zonename = row
end

クエリを生の SQL として実行し、通常のように結果にアクセスするにはどうすればよいですか?

if @zonename.name = "UK"
4

2 に答える 2

19

次の代わりに注意してください:

DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1")

やったほうがいい:

DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode)

それ以外の場合は、の内容を制御しないと、SQLインジェクションを利用できます@dialcode

于 2012-08-17T14:53:43.067 に答える
15

私は役に立つかもしれないいくつかのポインタを持っています:

  1. あなたは簡単に行うことができます:

     @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).first
    

注意:基準に一致する結果がさらに増える可能性があるという事実を無視しています。複数の可能な行が返されることが予想される場合は、次のようにして結果の配列を作成することをお勧めします...

    @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).all

そしてそれらすべてを処理します。

  1. リターンセットはハッシュです。レコードの1つを指している場合@zonenameは、次のことができます。

     @zonename[:column_name] 
    

「column_name」というフィールドを参照します。できません@zonename.column_name(実際には、メタプログラミングを使用してヘルパーメソッドで装飾することはできますが@zonename、今のところそれは無視しましょう)。

続編は優れたインターフェースであり、それについて学べば学ぶほど、それを好きになるでしょう。

于 2010-06-29T21:35:35.460 に答える