Я думаю, что сейчас это невозможно.Давайте попробуем выяснить, почему.
Когда вы пытаетесь передать свой пользовательский объект методу where
User.where(:name => custom_item)
, Арель пытается вызвать метод visit_YOUR_CLASS_NAME
(https://github.com/rails/arel/blob/master/lib/arel/visitors/visitor.rb#L15), но это не удается. ЗатемАрель пытается позвонить visit_
+ object.class.ancestors.find {|klass| respond_to?(DISPATCH[klass], true)}
, но снова не получается, потому что:
irb(main):001:0> class Foo
irb(main):002:1> end
=> nil
irb(main):003:0> foo = Foo.new
=> #<Foo:0x261edc0>
irb(main):004:0> foo.class.ancestors.map {|klass| p klass}
Foo
Object
Kernel
BasicObject
=> [Foo, Object, Kernel, BasicObject]
и у Арела нет ни одного из этих имен в этом списке https://github.com/rails/arel/blob/master/lib/arel/visitors/to_sql.rb#L394:
alias :visit_ActiveSupport_Multibyte_Chars :quoted
alias :visit_ActiveSupport_StringInquirer :quoted
alias :visit_BigDecimal :quoted
alias :visit_Class :quoted
alias :visit_Date :quoted
alias :visit_DateTime :quoted
alias :visit_FalseClass :quoted
alias :visit_Float :quoted
alias :visit_Hash :quoted
alias :visit_NilClass :quoted
alias :visit_String :quoted
alias :visit_Symbol :quoted
alias :visit_Time :quoted
alias :visit_TrueClass :quoted
На самом деле, я не думаю, что это очень полезная функция, но я спросил об этом Аарона Паттерсона, и если ему понравится, я постараюсь реализовать его.