2014-09-06 106 views
0

我想獲得一個非常簡單的聲明工作。Rails sql問題與簡單的語句

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

我真的懷疑第一個輸出,我想你給了錯誤的輸出,我沒有看到與代碼'Node.where(「nodeid =?」,nstart).select('id')' – 2014-09-06 13:43:31

+0

有任何關係。我三重檢查。它一定是一些緩存問題。我嘗試每次更改值並重新啓動服務器。現在我用第一個解決方案得到正確的結果,但它返回一個Node對象。我似乎也需要第一個。 – samst 2014-09-06 15:02:37

回答

1

如果你只是想在id值可以做到這一點

Node.where("nodeid = ?", nstart).limit(1).pluck(:id).first 

這將返回與價值

編輯 1個整數

OK從頭開始,我猜你不真的不需要使用limit所以一個簡單的first只會做

Node.where("nodeid = ?", nstart).first[:id] 

Node.where("nodeid = ?", nstart).first.id 
+0

'limit(1)'和'first'似乎做同樣的事情。但是由於limit(1)'仍然應該返回一個值集合(如果不用1調用),而'first'只有一個:'limit(1)'不應該在那裏。 – 2014-09-06 13:48:41

+0

好吧,我只是雙重檢查,我想首先確實通過它自己添加限制 – 2014-09-06 13:53:12

+0

雖然它不工作。 .first ['id']與我的第一個沒有任何參數相同。 '節點'。* FROM「nodes」WHERE(nodeid ='Rails')ORDER BY「nodes」。「id」ASC LIMIT 1'它甚至沒有選擇id,但是我仍然不明白跟進交易是。 Edge.new根本不應該在節點表上導致事務。 – samst 2014-09-06 14:09:11

0

你正在做一個查詢:(如果沒有合適的記錄或空數組)

Node.where("nodeid = ?", nstart).select('id') 

將返回對象的數組*不數組實際上。的ActiveRecord ::關係

如果使用「第一」像穆罕默德AbuShady說:

Node.where("nodeid = ?", nstart).select('id').first 

你會得到一個對象。如果你想值的整數ID(或零,如果沒有記錄)

,您可以從對象

Node.where("nodeid = ?", nstart).first.id 

選擇(「ID」)得到它告訴活動記錄不檢索表中的所有領域,只是「身份證」