2

I'm facing a problem with Loading a Constant in Rails console (rails console). Here how my structure look like this

- app
   - controllers
   - models 
     - earning
        - daily_earning.rb
        - monthly_earning.rb
        - weekly_earning.rb
        - yearly_earning.rb
   - views

Some more information

I also have a rake which look like this

namespace :past_days do
  desc "Past 7 Days Earning"
  task :earning => :environment do
    puts $:.select { |i| i=~ /models/ }.to_yaml
    7.downto(1).each do |i|
      start_date = i.days.ago.beginning_of_day
      puts "====== Dumping past #{start_date.strftime('%A')} earning ====="
      end_date = start_date.end_of_day
      Performer.top_daily_earners(start_date,end_date)
      puts "====== Dumped #{start_date.strftime('%A')} earning !!! ======="
      puts
    end 
  end
end 

And the top_daily_earners method look like this If you check this @klass = DailyEarning

def top_daily_earners(start_date=nil,end_date=nil)
  unless start_date or end_date
    date = 1.day.ago
    @start_date,@end_date = date.beginning_of_day,date.end_of_day
  end
  if start_date and end_date
    @start_date,@end_date = start_date,end_date
  end
  @klass = DailyEarning
  @earning_performers  = retrieve_earnings
  puts "COUNT -----"
  puts @earning_performers.count 
  puts ""
  store_earning
end

Question :

Now when I run rake task bundle exec rake past_days:earning (Rake run without any error) all work fine but when I run this

rails console see attach screenshot

enter image description here

I get errors NameError: uninitialized constant DailyEarning and I have manually require the file as can be seen the above screenshot

So the POINT of all the above question is why the error on rails console (NameError: uninitialized constant DailyEarning) and why not the error in rake task

Attaching DailyEarning Code based on @dtt comment

puts 'DailyEarning'
class DailyEarning
  include Mongoid::Document
  store_in session: "writeable"
  field :performer_id, :type => Integer
  field :user_id,:type => Integer
  field :stage_name,:type => String
  field :full_name,:type => String
  field :start_date,:type => DateTime
  field :end_date,:type => DateTime
  field :amount,:type => BigDecimal
  before_create :other_details
  ## Please avoid using default scope because it AFAIK it make the date parameter as static 

  class << self
    def default_scoping
      where(:start_date.gte => 1.day.ago.beginning_of_day).and(:end_date.lte => 1.day.ago.end_of_day)
    end
  end

  private
  def other_details
    ## Fetch from Mongo Instead of Mysql to avoid the slow sql query
    performer_source = PerformerSource.where(performer_id: performer_id).only([:stage_name,:user_id]).first
    self.user_id = performer_source.user_id
    self.stage_name = self.stage_name
    #self.full_name  = self.full_name
  end  
end
4

1 回答 1

-1

我的理解是,要在文件夹中自动加载模型,您需要为其命名:

在 app/models/earning/daily_earning.rb 中自动加载模型

class Earning::DailyEarning

end

可能你可以使用:

module Earning
  class DailyEarning
  end
end
于 2013-09-16T12:32:52.440 回答