Rails3 Arel访问自定义类



我有一个自定义类,但我希望能够将它传递给Arel,并让它解析其可查询的部分。

模块自定义类项目attr_accessor:namedef初始化(名称)self.name=名称终止终止终止custom_item=自定义::item.new("账单")用户.其中(:name=>custom_item)

我可以在custom_item中定义什么吗,这样它就会理解Arel想要从中命名吗?

目前我的解决方法是:

模块Arel模块访问者类ToSqldef visit_Custom_Itemo"'#{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]

阿瑞尔的名单上没有这些名字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'

使用轨道3.2.13。

对于类似字符串的值,您可能应该模仿String并使用visit_String

相关内容

  • 没有找到相关文章

最新更新