У меня есть модель с UUID, сохраненными в поле BINARY (16) в таблице MySQL. Я хотел бы смочь прозрачно преобразовать шестнадцатеричный uuid в двоичный файл для метода установщика и назад когда я использую метод получателя.
что состоит в том, чтобы продолжиться 'правильный' путь?
Вы переопределяете сеттер и геттер:
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
Я посмотрел исходный код 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 для добавления типов столбцов.