我正在努力得到一个非常简单的陈述。
Node.where("nodeid = ?", nstart).select('id')
结果
Parameters: {"utf8"=>"✓", "authenticity_token"=>"WpSpzLzaFUx8QgFbwEfygQUkkqvbUgZl8Hh0UxJvT8E=", "edge"=>{"kind"=>"IsA", "start_id"=>"blabla", "end_id"=>"bliblib", "property1"=>"bloblbo"}, "commit"=>"Create Edge"}
(0.0ms) begin transaction
Node Load (0.1ms) SELECT "nodes".* FROM "nodes" WHERE "nodes"."id" = ? LIMIT 1 [["id", 0]]
CACHE (0.0ms) SELECT "nodes".* FROM "nodes" WHERE "nodes"."id" = ? LIMIT 1 [["id", 0]]
(0.0ms) rollback transaction
它应该只是来自nodeid = blabla'的节点的'select nodes.id。限制并不重要。
但是,如果我添加.first。
Node.where("nodeid = ?", nstart).select('id').first
我得到了
Parameters: {"utf8"=>"✓", "authenticity_token"=>"WpSpzLzaFUx8QgFbwEfygQUkkqvbUgZl8Hh0UxJvT8E=", "edge"=>{"kind"=>"IsA", "start_id"=>"blabla", "end_id"=>"bliblib", "property1"=>"bloblbo"}, "commit"=>"Create Edge"}
Node Load (0.1ms) SELECT "nodes"."id" FROM "nodes" WHERE (nodeid = 'blabla') ORDER BY "nodes"."id" ASC LIMIT 1
Node Load (0.1ms) SELECT "nodes"."id" FROM "nodes" WHERE (nodeid = 'bliblib') ORDER BY "nodes"."id" ASC LIMIT 1
(0.0ms) begin transaction
Node Load (0.1ms) SELECT "nodes".* FROM "nodes" WHERE "nodes"."id" = ? LIMIT 1 [["id", 0]]
CACHE (0.0ms) SELECT "nodes".* FROM "nodes" WHERE "nodes"."id" = ? LIMIT 1 [["id", 0]]
(0.1ms) rollback transaction
现在第一个选择是它应该是什么,但后续再次像以前一样,似乎确定最终的返回值(因为它也不起作用)。我只想知道id,当我只知道nodeid时,它基本上就是节点的名称。
这里的Rails发生了什么?
答案 0 :(得分:1)
如果您只想要id
值,则可以执行此操作
Node.where("nodeid = ?", nstart).limit(1).pluck(:id).first
这将返回1个整数,其值为
修改强>:
好的从头开始,我猜你真的不需要使用limit
这样一个简单的first
就可以了
Node.where("nodeid = ?", nstart).first[:id]
或
Node.where("nodeid = ?", nstart).first.id
答案 1 :(得分:0)
您正在进行查询:
Node.where("nodeid = ?", nstart).select('id')
将返回一个对象数组(如果没有合适的记录,则返回空数组)*实际上不是数组。 ActiveRecord的::关系
如果你先使用'像穆罕默德·阿布沙迪(Mohammad AbuShady)所说:
Node.where("nodeid = ?", nstart).select('id').first
你得到一个对象(如果没有记录则为零)
如果你想要一个整数id值,你可以从对象
获取它Node.where("nodeid = ?", nstart).first.id
选择(' id')告诉有效记录不要检索表格中的所有字段,只是' id'