0

Ruby と Sinatra を使用して、Ajax 呼び出しを行っています。クエリは複数の行を返す必要がありますが、1 つしか返されません。

ajax スクリプトは次のとおりです。

$(document).ready(function() {
 $(".showmembers").click(function(e) {
            e.preventDefault();
            alert('script');
            var short_id =  $('#shortmembers').val();
            console.log(short_id);
            $.getJSON(
                "/show",
                 { 'id' : short_id },
                function(res, status) {
                        console.log(res);
                $('#result').html('');
                $('#result').append('<input type=checkbox value=' + res["email"] + '>');      
                $('#result').append( res["first"] );
                $('#result').append( res["last"] );
                $('#result').append( res["email"] );
                    });
        });
});

Rubyスクリプトは次のとおりです。

get '/show' do
id = params['id']
DB["select shortname, first, last, email from shortlists sh JOIN shortmembers sm ON sm.short_id = sh.list_id JOIN candidates ca ON ca.id = sm.candidate_id where sh.list_id = ?", id].each do |row|
    @shortname = row[:shortname]
    @first =  row[:first]
    @last = row[:last]
    @email = row[:email]
    puts @shortname
    puts @first
    puts @last
    puts @email
    halt 200, { shortname: @shortname, first: @first, last: @last, email: @email }.to_json
    end
end

postgres のターミナルでクエリを直接実行すると、9 行が返されますが、上記のように私の Web サイトでは、最初の行のみが返されます。

どうしたの?コンソールにエラーはありません。レコードは 1 つだけです。

4

1 に答える 1

0

あなたはhalt 200あなたのループの中にいます。これにより、Sinatra はリクエスト処理を終了し、結果をスタックに戻します。

結果の完全なセットを返すには、次のようなことを行う必要があります。

get '/show' do
    id = params['id']

    results = DB["select shortname, first, last, email from shortlists sh 
                  JOIN shortmembers sm ON sm.short_id = sh.list_id 
                  JOIN candidates ca ON ca.id = sm.candidate_id 
                  where sh.list_id = ?", id].map do |row|
        {
            :short_name => row[:shortname],
            :first=>row[:first],
            :last=>row[:last],
            :email=>row[:email]
        }
    end

    halt 200, results.to_json       
end

これにより、各行から選択されたフィールドがハッシュの配列として返されます。

実際、上記を見てみると、解決策は次のように単純かもしれません。

get '/show' do
    id = params['id']

    results = DB["select shortname, first, last, email from shortlists sh 
              JOIN shortmembers sm ON sm.short_id = sh.list_id 
              JOIN candidates ca ON ca.id = sm.candidate_id 
              where sh.list_id = ?", id]

    halt 200, results.to_json
end

そもそも必要な列以外は何も選択していないように見えるからです。

于 2013-09-19T13:57:32.493 に答える