2011-11-07 36 views
1

我有一個奇怪的小Rails問題。想象一下從ActiveRecord :: Base繼承的空的Invitation類。在sqlite3數據庫中有一個邀請,但ActiveRecord無法通過其令牌屬性找到它。跟着我們試圖找到它,看看你是否能找出原因。sqlite3無法通過屬性找到記錄

0 urzatron work/sunrise % rails c       
Loading development environment (Rails 3.1.0) 

irb(main):001:0> Invitation.all 
    Invitation Load (0.5ms) SELECT "invitations".* FROM "invitations" 
=> [#<Invitation id: 1, accepted_at: nil, assignment_id: 1, contact: "[email protected]", network: "email", sender_id: 1, sent_at: "2011-11-07 02:50:10", token: "41a673223a2b059b212ca3753896d3fd38e1d1dd">] 

irb(main):002:0> Invitation.find_by_token "41a673223a2b059b212ca3753896d3fd38e1d1dd" 
    Invitation Load (0.8ms) SELECT "invitations".* FROM "invitations" WHERE "invitations"."token" = '41a673223a2b059b212ca3753896d3fd38e1d1dd' LIMIT 1 
=> nil 

irb(main):003:0> Invitation.find 1 
    Invitation Load (82.7ms) SELECT "invitations".* FROM "invitations" WHERE "invitations"."id" = ? LIMIT 1 [["id", 1]] 
=> #<Invitation id: 1, accepted_at: nil, assignment_id: 1, contact: "[email protected]", network: "email", sender_id: 1, sent_at: "2011-11-07 02:50:10", token: "41a673223a2b059b212ca3753896d3fd38e1d1dd"> 

irb(main):004:0> Invitation.where(:token => "41a673223a2b059b212ca3753896d3fd38e1d1dd").first 
    Invitation Load (0.6ms) SELECT "invitations".* FROM "invitations" WHERE "invitations"."token" = '41a673223a2b059b212ca3753896d3fd38e1d1dd' LIMIT 1 
=> nil 

所以,這有點奇怪。

0 urzatron work/sunrise % rails dbconsole 
SQLite version 3.7.5 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 

sqlite> select * from invitations; 
1||1|[email protected]|email|1|2011-11-07 02:50:10.818984|41a673223a2b059b212ca3753896d3fd38e1d1dd 

sqlite> select * from invitations where token = "41a673223a2b059b212ca3753896d3fd38e1d1dd"; 

sqlite> 

這裏是對好奇的遷移。

class CreateInvitations < ActiveRecord::Migration 
    def change 
    create_table :invitations do |t| 
     t.datetime :accepted_at 
     t.references :assignment 
     t.string :contact, :null => false 
     t.string :network, :null => false 
     t.references :sender, :null => false 
     t.datetime :sent_at 
     t.string :token, :null => false 
    end 
    add_index :invitations, :accepted_at 
    add_index :invitations, [:network,:token] 
    add_index :invitations, :token 
    add_column :users, :invitation_id, :integer 
    end 
end 
+2

而你的問題是...? –

+0

什麼'選擇' - '||令牌|| ' - '從邀請'或'選擇邀請函中的長度(令牌)'必須從'rails dbconsole'說? –

+0

'select' - '||令牌|| ' - ' 從邀請;'=> ** - 41a673223a2b059b212ca3753896d3fd38e1d1dd - ** '選擇長度(令牌)從邀請;'=> ** 40 ** '選擇長度( 「41a673223a2b059b212ca3753896d3fd38e1d1dd」)'=> * * 40 ** –

回答

0

所以,這是1 2的東西:

  1. 字符串自動被sqlite的截斷由於某種原因
  2. 令牌是用Rails 3.1的保留字,它只是無證(還)
+0

這不是理由1.我有一個名爲「象徵性」的屬性另一種模式,這就是工作的罰款 –

+0

而且這不是原因2: sqlite的> SELECT * FROM邀請其中token像「41a673223a2b059b212ca3753896d3fd38e1d1dd」; 1。 ||1|[email protected]|email|1|2011-11-07 02:50:10.818984 | 41a673223a2b059b212ca3753896d3fd38e1d1dd –

1

我剛剛遇到同樣的錯誤(我認爲)。我用SecureRandom.hex(8)生成了我的令牌,並且無法執行* find_by_token *操作。

如果我用SecureRandom.urlsafe_base64(8)代替代幣生成,這個錯誤就被修正了。

請參閱https://github.com/NoamB/sorcery/issues/19瞭解更多信息。

0

昨天我遇到了這個問題,事實證明,將'token'類型改爲字符串而不是文本。一旦我這樣做了,SQLite3就可以正確地進行選擇。

在遷移

所以(或改變如果你願意),我還沒有發佈,所以我只是重新進行遷移:

t.text :token 

將變爲

t.string :token 

所有最優秀的。