【问题标题】:How do I add a custom predicate-builder in Rails 5?如何在 Rails 5 中添加自定义谓词构建器?
【发布时间】:2016-11-30 14:37:10
【问题描述】:

在 Rails 4 中,如果我有一个 ArrayLikeClass 类,并且我想在像 Model.where(id: instance_of_array_like_class) 这样的查询中使用它的对象,我可以通过注册一个谓词构建器来实现:

ActiveRecord::PredicateBuilder.register_handler(ArrayLikeClass, ActiveRecord::PredicateBuilder::ArrayHandler.new)

之后,ArrayLikeClass 的实例在 where 查询中使用时的行为与 Array 的实例相同。

但是,在 Rails 5 中,API 发生了变化,ActiveRecord::PredicateBuilder::ArrayHandler.new 现在需要ActiveRecord::PredicateBuilder 的实例。 register_handler 现在也是ActiveRecord::PredicateBuilder 中的一个实例方法

那么,如何在 Rails 5 中为自定义类注册谓词构建器处理程序?

【问题讨论】:

  • github.com/rails/rails/blob/… 是你要找的吗?
  • @fanta 有点是的,但我不想提及表格/模型,而是想让所有模型都可以使用它。此外,我更愿意重用现有的 ActiveRecord::PredicateBuilder::ArrayHandler.new,但它需要一个 ActiveRecord::PredicateBuilder 的实例,我不确定在哪里可以找到。
  • 好吧,我觉得现在不可能了,好像这里改了github.com/rails/rails/commit/…,如果你看到了,方法现在是实例方法而不是类方法。检查测试。

标签: ruby-on-rails activerecord ruby-on-rails-5


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2017-06-11
    相关资源
    最近更新 更多