Rails: использование двоичного значения для запроса двоичного столбца ничего не возвращает - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть двоичный столбец, который содержит 256-битные контрольные суммы. Я могу хранить контрольные суммы, но когда я пытаюсь выполнить запрос через контрольную сумму, ничего не возвращается.

d = Digest::SHA2.new
d.update "large str i'm creating the hash with"
begin
    codebase = Codebase.find_or_create_by_checksum(d.digest)
rescue ActiveRecord::StatementInvalid => e
    # handle duplicate record error
end

Я пробовал где и разные версии найти. Ничего не возвращается Когда я использую find_or_create_by_checksum, поскольку он ничего не находит, он пытается создать его, и возникает исключение, так как у меня есть индекс uniq в столбце контрольной суммы, но все же мне нужно иметь возможность получить запись с соответствующей контрольной суммой.

    create_table :codebases do |t|
        t.binary :checksum, :null => false, :limit => 32
    end

    add_index :codebases, :checksum, :unique => true, :name => 'name_of_the_codebas_uniq_index'

Кто-нибудь знает, как это сделать?

1 Ответ

0 голосов
/ 20 декабря 2011

Так что, если его двоичный файл в базе данных, я не могу воспроизвести:

миграция:

class Checksum < ActiveRecord::Migration
  def up
    create_table :checksums do |t|
        t.binary :checksum, :null => false, :limit => 32
    end
  end

  def down
  end
end

А потом попробуем это на консоли рельсов:

ruby-1.9.2-p290 :009 > Checksum.create(:checksum => digest.digest)
  SQL (0.4ms)  INSERT INTO "checksums" ("checksum") VALUES (?)  [["checksum", ",&\xB4kh\xFF\xC6\x8F\xF9\x9BE<\x1D0A4\x13B-pd\x83\xBF\xA0\xF9\x8A^\x88bf\xE7\xAE"]]
 => #<Checksum id: 1, checksum: ",&\xB4kh\xFF\xC6\x8F\xF9\x9BE<\x1D0A4\x13B-pd\x83\xBF\xA0\xF9\x8A^\x88bf\xE7\xAE"> 

ruby-1.9.2-p290 :010 > Checksum.first
  Checksum Load (0.2ms)  SELECT "checksums".* FROM "checksums" LIMIT 1
 => #<Checksum id: 1, checksum: ",&\xB4kh\xFF\xC6\x8F\xF9\x9BE<\x1D0A4\x13B-pd\x83\xBF\xA0\xF9\x8A^\x88bf\xE7\xAE"> 

ruby-1.9.2-p290 :011 > Checksum.find_by_checksum(digest.digest)
  Checksum Load (0.1ms)  SELECT "checksums".* FROM "checksums" WHERE "checksums"."checksum" = x'2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae' LIMIT 1
 => #<Checksum id: 1, checksum: ",&\xB4kh\xFF\xC6\x8F\xF9\x9BE<\x1D0A4\x13B-pd\x83\xBF\xA0\xF9\x8A^\x88bf\xE7\xAE"> 

Так что все работает как положено .....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...