Metrics/Parameterlists Error in Too Many Method Params

I've got an API resource to fetch transaction list. There are few filters and params to make it sortable e.g. per_page, status etc. which may be passed on but only user_id is required. Now my method looks like this:

def list(user_id:, page: nil, per_page: nil, status: nil, payment_id: nil, start_date: nil,
         end_date: nil, max_amount: nil)

  filters = { start_date:, end_date:, max_amount:, status:, payment_id: }.compact_blank!
  params = { filters:, page:, per_page: }.compact_blank!

  begin
    body = get("users/#{user_id}/transactions", params:).body
  rescue Errors::NotFoundError
    nil
  end
  resource_list(body, BaseStruct::Transaction)
end

This code produces me Rubocop error of: Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]. I know I could get rid of it by # rubocop:disable Metrics/ParameterLists but I don't think that's the best idea. Is it possible to pass those not required field in a different way to avoid that error?

2 Answers

Since you are passing 3 kinds of parameters to the list method, you can group them and pass them to the method like below:

def list(user_id, filter_params, page_params)
  filters = filter_params.compact_blank!
  params = { filter_params, page_params.slice(:page), page_params.slice(:per_page) }.compact_blank!

  begin
    body = get("users/#{user_id}/transactions", params).body
  rescue Errors::NotFoundError
    nil
  end
  resource_list(body, BaseStruct::Transaction)
end

list(user_id, { status: nil, payment_id: nil, start_date: nil, end_date: nil, max_amount: nil }, { page: nil, per_page: nil })

There is CountKeywordArgs option that I found useful to set false.

My rationale is that kwargs add less complexity than positional or optional parameters. It's more effective replacement of old-school Hash options argument.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Alexander Ross

Alexander Ross

Gaming, Esports & Interactive Media Writer

Alexander Ross has covered the video game industry for a decade, writing deep dives on game design, esports tournaments, VR developments, and gaming culture.

Share this article
Twitter Facebook Pinterest