Tit*_*tas 5 ruby visitor arel ruby-on-rails-3
我有一个自定义类,但我希望能够将它传递给Arel并让它解析其可查询部分.
module Custom
class Item
attr_accessor :name
def initialize(name)
self.name = name
end
end
end
custom_item = Custom::Item.new("Bill")
User.where(:name => custom_item)
有什么我可以在custom_item中定义,所以它会理解Arel想要它的名字吗?
目前我解决方法:
module Arel
module Visitors
class ToSql
def visit_Custom_Item o
"'#{o.name}'"
end
end
end
end
我认为现在不可能.让我们试着找出原因.
当您尝试将自定义对象传递给where方法时,User.where(:name => custom_item)Arel尝试调用visit_YOUR_CLASS_NAME方法(https://github.com/rails/arel/blob/master/lib/arel/visitors/visitor.rb#L15)但它失败了.然后Arel尝试调用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]
Run Code Online (Sandbox Code Playgroud)
和Arel在此列表中没有任何此名称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
Run Code Online (Sandbox Code Playgroud)
实际上,我认为这不是一个非常有用的功能,但我已经问过Aaron Patterson,如果他愿意,我会尝试实现它.