Search code examples
ruby-on-railsrubycode-climate

Code Climate - Too Complex Error


I'm using code climate on one of my projects, and I'm getting an error for have "too complex" of code. I'm not sure how to make the code it's calling out less complex? Here it is:

Method:

 def apply_json
    {
      total_ticket_count: payment_details.tickets.count,
      subtotal: payment_details.subtotal.to_f,
      discount: payment_details.discount.to_f,
      fees: payment_details.fees_total.to_f,
      total: payment_details.total_in_dollars.to_f,
      coupon: {
        amount: payment_details.coupon.amount,
        type: payment_details.coupon.coupon_type,
        name: payment_details.coupon.name,
        valid: payment_details.coupon.valid_coupon?,
      }
    }
 end

It's just JSON that I tucked away in a model. Everything on my branch is great expect for this? I'm not sure what to do? Any ideas on how I can make this less complex?


Solution

  • I wouldn't care too much if Code Climate thinks something is too complex, but actually is easy to understand. Code Climate should help you to write better, easy to read code. But it doesn't provide hard rules.

    If you really want to change something, you might want to move the generation of the coupon sub hash to the Coupon model, because it only depends on values provided by the coupon association:

    def apply_json
      {
        total_ticket_count: payment_details.tickets.count,
        subtotal:           payment_details.subtotal.to_f,
        discount:           payment_details.discount.to_f,
        fees:               payment_details.fees_total.to_f,
        total:              payment_details.total_in_dollars.to_f,
        coupon:             payment_details.coupon.as_json
      }
    end
    
    # in coupon.rb
    def as_json
      {
        amount: amount,
        type:   coupon_type,
        name:   name,
        valid:  valid_coupon?
      }
    end
    

    A similar refactoring can be done with payment_details but it is not sure, where this attribute is coming from and if it is an associated model.