如何透明地修改模型中的ActiveRecord方法?

dim*_*mus 6 activerecord ruby-on-rails

我有一个模型,UUID存储在MySQL表的BINARY(16)字段中.我希望能够透明地将十六进制uuid转换为二进制用于setter方法,并在我使用getter方法时返回.

什么是'正确'的方式进行?

Fra*_*eil 7

你重写setter和getter:

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
Run Code Online (Sandbox Code Playgroud)

当然,您需要一个BINARY列,因为您正在向DB发送原始字节.像这样的迁移:

class AddUuidToUsers
  def self.up
    execute "ALTER TABLE users ADD uuid BINARY(16)"
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 使用add_column with:binary不会给出BINARY类型.它将提供BLOB类型. (2认同)