-1

在下面的一段代码上

def initialize(clause)
      clause =~ /^([\w\_\.]+)(->'\w+')?_(desc|asc)$|^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
      @column = $1 || $4
      @op = $2 || $5
      @order = $3 || $6
      @field = [@column, @op].compact.join
    end

我收到以下错误

ArgumentError (wrong number of arguments (given 2, expected 1)):
  config/initializers/order_clause.rb:5:in `initialize' 

有谁知道如何解决它?请帮忙!

编辑- 我正在添加完整的代码以进行更多说明。

module ActiveAdmin
  class OrderClause
    attr_reader :field, :order

    def initialize(clause)
      clause =~ /^([\w\_\.]+)(->'\w+')?_(desc|asc)$|^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
      @column = $1 || $4
      @op = $2 || $5
      @order = $3 || $6
      @field = [@column, @op].compact.join
    end

    def valid?
      @field.present? && @order.present?
    end

    def to_sql(active_admin_config)
      table = column_in_table?(active_admin_config.resource_column_names, @column) ? active_admin_config.resource_table_name : nil
      if json_column?(@column)
        table_column = (@column =~ /\./) ? @column : [table, @column].compact.join(".")
        ['(', table_column, @op, ' ',')::numeric ', @order].compact.join
      else
        table_column = (@column =~ /\./) ? @column : [table, active_admin_config.resource_quoted_column_name(@column)].compact.join(".")
        [table_column, @op, ' ', @order].compact.join
      end
    end

    private

    def json_column?(column)
      column.include?('->>')
    end

    def column_in_table?(names, column)
      column = json_column?(column) ? column.split('->>')[0].strip : column
      names.include?(column)
    end
  end
end

4

3 回答 3

1

如您在此处此处所见,activeadmingemActiveAdmin::OrderClause使用几个参数 (active_admin_config和) 实例化该类。修复方法参数。orderinitialize

def initialize(active_admin_config, clause)
  # ... 
end

您还应该active_admin_config从方法中删除参数,to_sql因为它是在没有参数的情况下调用的。您可以@active_admin_configinitialize方法中设置并添加:active_admin_configattr_reader调用中以在to_sql方法中使用。

module ActiveAdmin
  class OrderClause
    attr_reader :field, :order, :active_admin_config

    def initialize(active_admin_config, clause)
      @active_admin_config = active_admin_config
      # rest of the code
    end

    def to_sql
      # ...
    end
  end
end

我建议您创建一个CustomOrderClause从 gem 类继承的ActiveAdmin::OrderClause类,并且只覆盖必要的方法。然后,您可以config.order_clause = CustomOrderClause在初始化程序中配置 activeadmin 时使用。

于 2021-04-07T08:30:39.970 回答
0

而不是覆盖整个类,您应该能够Module#prepend只更改您有兴趣更改的功能,而不必担心其余的实现。例如

module OrderClauseExtension 
  def initialize(active_admin_config, clause)
      super
      if field.empty?
        clause =~ /^([\w\_\.]+->>'[\w\_]+')(->'\w+')?_(desc|asc)$/
        @column = $1 
        @op = $2 
        @order = $3
        @field = [@column, @op].compact.join
      end
  end
end 

ActiveAdmin::OrderClause.prepend(OrderClauseExtension) 

field这将首先尝试原始实现,并在属性导致空的情况下将您的实现用作后备,String这将是这种情况[nil,nil].compact.join #=> ""

此类中包含的所有其余功能将保持不变,您不必担心 gem 本身的任何更改(除非此处分配的初始化方法和/或属性发生更改)

您可以将此文件放在config/initializers.

于 2021-04-07T19:03:44.620 回答
0

我认为您正在尝试覆盖ActiveAdmin::OrderClause,如果您看到 ActivAdmin 的代码,您会发现:

module ActiveAdmin
  class OrderClause
    attr_reader :field, :order, :active_admin_config

    def initialize(active_admin_config, clause)
      clause =~ /^([\w\.]+)(->'\w+')?_(desc|asc)$/
      @column = $1
      @op = $2
      @order = $3
      @active_admin_config = active_admin_config
      @field = [@column, @op].compact.join
    end

这意味着无论在哪里初始化它都会用两个参数进行初始化,因为它们的构造函数接受它。因此,您将不得不更改initialize代码中的方法以接受两个参数或仅从调用它的任何位置传递一个参数,这将是乏味的。

于 2021-04-07T08:30:22.040 回答