Pergunta

Estou tentando usar o MongoMapper no meu aplicativo Sinatra para um site de leilão simples, mas estou tendo problemas para executar uma consulta simples e obter resultados.

before '/auction/:id' do
    connection = Mongo::MongoClient.new
    db = connection.db('auction')
    collection = db['auctions']

    @query = Plucky::Query.new(collection)
end

get '/auction/:id' do
    @auction = @query.where({:id => params["id"].to_i})
    "#{@auction.inspect}"
end

Mas eu não tenho saída com @auction.inspect no navegador. No entanto, quando eu uso a consulta @auction = @query.all Eu recebo todos os registros no meu banco de dados.

Params (ao usar o URL localhost/leilão/3):

{"splat"=>[], "captures"=>["3"], "id"=>"3"}

query.all resultado:

[{"_id"=>BSON::ObjectId('529cbbee21f7f10dd4000005'), "id"=>2, "name"=>"jump", "price"=>1.42}, {"_id"=>BSON::ObjectId('529cbbf821f7f10dd400000e'), "id"=>3, "name"=>"here", "price"=>93.34}]
Foi útil?

Solução

MongoMapper (ou com mais precisão, Plucky, a biblioteca que constrói consultas de Mongomapping) lança um campo chamado id para _id automaticamente para paridade com o ActiveRecord, para que você não possa usar dois campos diferentes chamados _id e id. Você verá que, se olhar para a consulta gerada em seus logs.

Nesse caso, você deseja usar um nome de campo diferente.

Outras dicas

.where constrói a associação, mas você precisará chamar um método como all ou first Para realizar a consulta e obter resultados:

@auction = @query.where({:id => params["id"].to_i}).first
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top