Trung Tran
Trung Tran

Reputation: 13741

Count Records within 30 days of today

I Have a model an Opportunity model that has an attribute called date_of_opportunity. I am trying to write a method that counts how many opportunities are within 30 days of today. However when I try to call my method in the console, I get the error 'undefined local variable or method'

Here is my model:

class Opportunity < ActiveRecord::Base
     def calculate_num_days
         num_days = 0
         @opportunity = Opportunity.all
         @opportunity.each do |opportunity|
        if (opportunity.date_of_opportunity - Date.today < 30)
            num_days = num_days + 1
            return num_days
        end
         end

        end
end

Can someone help me figure out whats wrong? Thanks!!

Upvotes: 0

Views: 240

Answers (4)

rails_id
rails_id

Reputation: 8220

If you will get counts how many opportunities are within 30 days of today, you can try this :

class Opportunity < ActiveRecord::Base

 def self.calculate_num_days(from = (Date.today-1.month).beginning_of_day,to = Date.today.end_of_day)
   where(date_of_opportunity: from..to).count
 end

end

And on your console you can type like this

Opportunity.calculate_num_days

Output looks like :

irb(main):001:0> Opportunity.calculate_num_days
←[0m←[1m←[35m (51.0ms)←[0m  SELECT COUNT(*) FROM "opportunities" WHERE ("opportunities"."date_of_opportunity" BETWEEN '2014-05-04 00:00:00.000000' AND '2014-06-04 23:59:59.999999')
=> 2

Upvotes: 1

sawa
sawa

Reputation: 168139

You seem to want a class method, but are defining an instance method. Do this:

def self.calculate_num_days
 ...
end

Upvotes: 1

Patrick
Patrick

Reputation: 3684

Unless I am missing what you are trying to do I would let ActiveRecord do the heavy lifting. Opportunity.where("date_of_opportunity - :today < 30", today: Date.today).size

Disclaimer, this is completely untested

Upvotes: 0

user926467
user926467

Reputation: 23

Maybe, @opportunity = Opportunity.all should be @opportunities = Opportunity.all

Upvotes: 0

Related Questions