4

ruby の mysql gem に苦労しており、ステートメントを準備しています。
結果に対して行うのと同じ結果になりたいeach_hashのですが、準備ステートメントではサポートされていません。だから私はこの恐ろしい混乱をもたらしました。

  stmt = @db.prepare("SELECT mat_id, name, qty FROM materials WHERE mat_id = ? ")

  #those 3 lines hurt my eyes
  res = stmt.execute(params[:id])
  mat_id, name, qty  =  res.bind_result(Integer, String, Integer).fetch
  @material = [mat_id: mat_id, name: name, qty: qty]

結果をフェッチしてハッシュの配列を取得するためのより良い方法が必要です。

より良い mysql gem が有効な答えになる可能性があります。ORM は NOT です。

4

3 に答える 3

2

コメントを見て、引き続き続編のリンクを回答として投稿します。

http://sequel.rubyforge.org/

Sequel のモデル部分を使用する必要はまったくありません。実際、ドキュメントには SQL ジャンキー専用のセクション全体があります。

http://sequel.rubyforge.org/rdoc/files/doc/sql_rdoc.html

クエリの例:

DB.fetch("SELECT * FROM albums WHERE name LIKE ?", 'A%') do |row|
  puts row[:name]
end
于 2013-06-13T10:26:00.567 に答える
2

一発ギャグ!

Hash[stmt.result_metadata.fetch_fields.map(&:name).zip( stmt.fetch )]

またはより堅牢

row = stmt.fetch
Hash[stmt.result_metadata.fetch_fields.map(&:name).zip( row )] if row
于 2015-03-26T18:58:01.520 に答える
1

http://tmtm.org/en/mysql/ruby/によると、結果には「each_hash」メソッドがありますが、ステートメントにはありません。なんてお尻の痛み...

#A proxy for the statement class
class Stmt

  def each_hash
    fields = @target.result_metadata.fetch_fields.map do |f| f.name.to_sym end 
    @target.execute.each do |x| 
      hash = {}
      fields.zip(x).each do |pair|
        hash[pair[0]] = pair[1]
      end 
      yield hash
    end 
  end 

  def initialize(target)
    @target = target
  end 

  def method_missing(name, *args, &block)
    @target.send(name, *args, &block)
  end 
end

これで、次のことができます。

Stmt.new(@db.prepare(...).execute(...)).each_hash do |x|
  puts x
end

各行をハッシュとしてループできます。

私はまだ複数回の実行でこれをテストしていません

于 2013-12-04T21:21:20.857 に答える