0

我正在使用 Ruby 和 Sinatra 进行 Ajax 调用。查询应该返回多行,但它只返回一个。

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 行,但是,如上所述,在我的网站上,它只返回第一行。

有什么问题?控制台没有错误,只有一条记录。

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 回答