在Rails 4中,如果我有一个ArrayLikeClass
类,并且我想在Model.where(id: instance_of_array_like_class)
这样的查询中使用它的对象,我可以通过注册谓词构建器来实现:
ActiveRecord::PredicateBuilder.register_handler(ArrayLikeClass, ActiveRecord::PredicateBuilder::ArrayHandler.new)
之后ArrayLikeClass
的实例在用于查询的地方时的行为与Array
的实例相同。
但是,使用Rails 5,API已更改,ActiveRecord::PredicateBuilder::ArrayHandler.new
现在需要ActiveRecord::PredicateBuilder
的实例。 register_handler
现在也是ActiveRecord::PredicateBuilder
中的一个实例方法。
那么,如何在Rails 5中为自定义类注册谓词构建器处理程序?
虽然这是一个老问题,但我遇到了类似的问题,但我也想要使用自定义处理程序。一个是你能做到这一点是通过在predicate_builder方法中注册模型中的处理程序。您可以在基本模型,模块中执行此操作,但是,如果您在基本模型中执行操作,例如它将如下所示:
class ApplicationRecord < ActiveRecord::Base
...
def self.predicate_builder
return @local_predicate_builder if @local_predicate_builder
@local_predicate_builder = super
@local_predicate_builder.register_handler(ArrayLikeClass, ArrayLikeClassHandler.new(@local_predicate_builder))
@local_predicate_builder
end
...
end
虽然这使用自定义处理程序类,您可以尝试将ArrayLikeClassHandler
更改为ActiveRecord::PredicateBuilder::ArrayHandler
,但我只尝试使用自定义处理程序。
这是ActiveRecord link中方法的链接。