我希望根据用户的输入动态传递此集合名称和选项。
query = "test_collection.find.skip(2).limit(100)"
collection, options = query.split(".", 2)
=> ["test_collection", "find.skip(2).limit(100)"]
Mongo::Client.new("mongodb+srv://user:pass@clusteruri.net/testdb?w=majority&connectTimeoutMS=123") do |conn|
rows << conn[collection].send(options).to_a
end
mongo::collection:0x0000720的未定义方法“find.skip(2).limit(100)”
但是,当options=“find”时,这种方法可以正常工作。我认为多种选择都不起作用。尝试
行<<conn[collection].options.to_a=>空结果
行<<conn[collection].send(*选项)。to_a=>未定义的方法错误
行<<conn[collection].send(**选项)。to_a=>不将字符串隐式转换为哈希
如何动态传入链式方法>
1条答案
按热度按时间kyks70gy1#
send
需要将方法名称指定为第一个参数,并将参数指定为附加参数。它不接受包含名称、参数和所需标点符号的字符串。对于上述问题,最接近实际情况的是eval
.然而,
eval
用户输入的错误是极其危险的。例如,您可能允许用户删除您的所有数据。您应该从用户提供的输入中解析选项,并将它们与白名单(例如
skip
,limit
,如有必要,验证参数,并构造适当的调用。