如何在Rails 5中添加自定义谓词生成器?

问题描述 投票:2回答:1

在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中为自定义类注册谓词构建器处理程序?

ruby-on-rails activerecord ruby-on-rails-5
1个回答
0
投票

虽然这是一个老问题,但我遇到了类似的问题,但我也想要使用自定义处理程序。一个是你能做到这一点是通过在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中方法的链接。

© www.soinside.com 2019 - 2024. All rights reserved.