sqlite3 не может найти запись по атрибуту - PullRequest
1 голос
/ 07 ноября 2011

У меня странная маленькая проблема с Rails. Представьте себе пустой класс Invitation, унаследованный от ActiveRecord :: Base. В базе данных sqlite3 есть одно приглашение, но ActiveRecord не может найти его по атрибуту token . Продолжайте, пока мы пытаемся найти его, и посмотрим, сможете ли вы выяснить, почему.

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: "dean@example.net", 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: "dean@example.net", 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|dean@example.net|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

Ответы [ 3 ]

1 голос
/ 13 ноября 2011

Я только что столкнулся с той же ошибкой (я думаю).Я сгенерировал свои токены с помощью SecureRandom.hex(8) и не смог сделать * find_by_token *.

Если я заменил генерацию токена на SecureRandom.urlsafe_base64(8), ошибка исправлена.

См. https://github.com/NoamB/sorcery/issues/19 для получения дополнительной информации.

0 голосов
/ 13 ноября 2011

Я столкнулся с этой проблемой только вчера, и оказалось, что изменение типа 'токена' на строку вместо текста. Как только я это сделал, SQLite3 смог правильно сделать выбор.

Итак, в процессе миграции (или изменения, если хотите) я еще не выпустил, поэтому просто перенастроил:

t.text :token

изменится на

t.string :token

Всего наилучшего.

0 голосов
/ 07 ноября 2011

Итак, это 1 из 2 вещей:

  1. По какой-то причине sqlite автоматически обрезает строки
  2. Токен - это зарезервированное слово в Rails 3.1, и оно просто недокументировано (пока)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...