Rails3 Arel访问自定义类

| 我有一个自定义类,但我希望能够将其传递给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
。     

要回复问题请先登录注册