Rails 3: использование Comme_of с проверкой вызывает ошибку ActiveRecord - PullRequest
3 голосов
/ 05 февраля 2012

Я использую следующий фрагмент кода из документации Rails для преобразования IP-адресов в целые числа перед их вставкой в ​​базу данных:

composed_of :user_ip,
            :class_name => 'IPAddr',
            :mapping => %w(user_ip to_i),
            :constructor => Proc.new { |ip| IPAddr.new(ip, Socket::AF_INET) },
            :converter => Proc.new { |ip| ip.is_a?(Integer) ? IPAddr.new(ip, Socket::AF_INET) : IPAddr.new(ip.to_s) }

Затем за блоком selected_of следует простая проверка:

validates_uniqueness_of :user_ip

Но проверка в свою очередь выдает ошибку при попытке создать новый объект:

TypeError: Cannot visit IPAddr

Удалите проверку, и ошибка исчезнет.

Если я правильно понимаю, это происходит потому, что: user_ip становится объектом IPAddr, и это не совсем подходит для ActiveRecord. Это правильно, и если так, есть ли способ обойти это?

1 Ответ

2 голосов
/ 24 апреля 2012

Не уверен, что вы когда-нибудь нашли решение для этого, но я смог залатать его в своем драгоценном камне, добавив метод посещения к Arel.

Вы должны быть в состоянии сделать что-то вроде следующего, чтобы заставить его работать. Это основано на том, как Arel преобразует значения для других типов объектов, таких как даты. Не уверен, если вам нужно преобразовать значение в строку, но оно может просто работать как целое число.

module Arel
  module Visitors
    class ToSql
      def visit_IPAddr
        quote(value.to_i)
      end
    end
  end
end

Мне нужно было иметь возможность динамически генерировать эти методы, поэтому я использовал в своем геме следующее:

Arel::Visitors::ToSql.class_eval do
  define_method "visit_#{klass.name}", lambda {|value| quote(value.to_s) }
end
...