Agazoom
Agazoom

Reputation: 618

Where should method go (model?, somewhere else)

I've got a method in one of my models which returns data which will be fed into a charting gem.

class MyModel < ActiveRecord::Base
  def ownership_data
        format_data(item_ownerships.group(:owned).count)
  end
end

I need to guarantee that the data return always has 2 values in the result. Something like this:

{ "yes" => 4, "no" => 2 }

In order to do this, I've written another method which is used in the first method:

def format_data(values)
   values[false].nil? ? values = values.merge({ "no" => 0 }) : true
   values[true].nil? ? values = values.merge({ "yes" => 0 }) : true

   return values
end

My question is, where should this method go and how can I unit test it using rspec? I've currently got it in the model, however in trying to test it with rspec, my specs look like this:

let(:values) { { "yes" =>2 } }

it "it will return 2 values" do
    result = MyModel.new.format_data(values)
    expect(result.keys.count).to eq(2)
end

I'm not too happy about having to instantiate an instance of the model to test this. Any guidance is appreciated.

Upvotes: 0

Views: 81

Answers (1)

creativereason
creativereason

Reputation: 1524

As AJ mentioned in the comment, we probably need more information to go on to give more specific advice. I'll give some anyway...

If you have a object that isn't necessarily depending on the model itself, you should consider moving it to a plain old ruby object or a service object. Those can live in a separate folder (lib/services) or in your models folder without inheriting from ActiveRecord::Base.

Your method could also be a class method def self.method_name(values, values_2) instead of a instance method (if you don't need specific values from the model).

When it comes to data manipulation for reporting for my projects, I've built specific folder of ruby service objects for those under 'lib/reports' and they take raw data (usually in init method) and return formatted data from a method call (allowing me to have multiple calls if the same data can be formatted in different output options). This makes them decoupled from the model. Also, this makes testing easy (pass in known values in Class.new expect specific values in method outputs.

Upvotes: 2

Related Questions