问题描述
|
我有一个自定义类,但我希望能够将其传递给Arel并让其解析其可查询部分。
自定义模块
类项目
attr_accessor:名称
def initialize(名称)
self.name =名称
结束
结束
结束
custom_item = Custom :: Item.new(\“ Bill \”)
User.where(:name => custom_item)
有什么我可以在custom_item中定义的东西,所以它会理解Arel要从中获取名称吗?
目前,我的解决方法是:
模块Arel
模块访客
Tosql类
def visit_Custom_Item o
\“ \'#{o.name} \'\”
结束
结束
结束
结束
解决方法
我认为现在不可能了。让我们尝试找出原因。
当您尝试将自定义对象传递给
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]
并且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
实际上,我认为这不是一个非常有用的功能,但是我已经向亚伦·帕特森(Aaron Patterson)询问过,如果他愿意的话,我将尝试实现它。
, 通过为我的班级定义to_s
方法,我可以解决这个问题
class CustomItem
def to_s
custom_id
end
end
并欺骗Arel Visitor将我的班级视为Fixnum
Arel::Visitors::Visitor::DISPATCH[CustomItem] = \'visit_Fixnum\'
使用Rails 3.2.13。
对于类似字符串的值,您可能应该模仿String
并使用visit_String
。