Как я могу прозрачно изменить метод ActiveRecord в модели?

У меня есть модель с UUID, сохраненными в поле BINARY (16) в таблице MySQL. Я хотел бы смочь прозрачно преобразовать шестнадцатеричный uuid в двоичный файл для метода установщика и назад когда я использую метод получателя.

что состоит в том, чтобы продолжиться 'правильный' путь?

6
задан dimus 8 February 2010 в 19:10
поделиться

2 ответа

Вы переопределяете сеттер и геттер:

class User < ActiveRecord::Base
  def uuid=(value)
    @uuid = write_attribute(:uuid, value.scan(/../).map {|n| n.to_i(16)}.pack("C*"))
  end

  def uuid
    @uuid ||= read_attribute(:uuid).unpack("C*").map {|n| sprintf("%02x", n)}.join
  end
end

Конечно, вам нужен столбец БИНАРИЙ, потому что вы посылаете необработанные байты в БД. Миграция, подобная этой:

class AddUuidToUsers
  def self.up
    execute "ALTER TABLE users ADD uuid BINARY(16)"
  end
end
7
ответ дан 16 December 2019 в 21:39
поделиться

Я посмотрел исходный код ActiveRecord 2.3.5 (mysql_adapter.rb). Глядя на хэш NATIVE_DATABASE_TYPES, становится ясно, что он не поддерживает тип данных BINARY (16):

NATIVE_DATABASE_TYPES = {
  :primary_key => "int(11) DEFAULT NULL auto_increment PRIMARY KEY".freeze,
  :string      => { :name => "varchar", :limit => 255 },
  :text        => { :name => "text" },
  :integer     => { :name => "int", :limit => 4 },
  :float       => { :name => "float" },
  :decimal     => { :name => "decimal" },
  :datetime    => { :name => "datetime" },
  :timestamp   => { :name => "datetime" },
  :time        => { :name => "time" },
  :date        => { :name => "date" },
  :binary      => { :name => "blob" },
  :boolean     => { :name => "tinyint", :limit => 1 }
}

Также обратите внимание, что: binary - это не то, что вам нужно, потому что это создает столбец BLOB.

Если у вас есть желание, я бы порекомендовал расширить ActiveRecord для поддержки типа BINARY (16).

Обновление: после некоторого поиска следующее сообщение в блоге Мэтью Хиггинса кажется многообещающим («Хотя при миграции могут выполняться произвольные операторы SQL, альтернативой является расширение адаптера MySql для поддержки новых типов столбцов»): { {1}} http://www.strictlyuntyped.com/2008/07/mysql-lovin-part-2-adding-new-column.html

Если вы заставите это работать, я надеюсь, что вы делитесь тем, что придумываете. Как и Мэтью, я хотел бы, чтобы в ActiveRecord был более чистый API для добавления типов столбцов.

1
ответ дан 16 December 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: