Rails sql问题带有一个简单的where语句

时间:2014-09-06 12:46:53

标签: sql ruby-on-rails

我正在努力得到一个非常简单的陈述。

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发生了什么?

2 个答案:

答案 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'