2

Rails コンソール (Rails コンソール) での定数の読み込みに関する問題に直面しています。ここで私の構造はこのように見えます

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

もう少し情報

私はまた、このように見えるレーキを持っています

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 

そして、top_daily_earnersメソッドは次のようになりますこれをチェックすると@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

質問 :

rake タスクbundle exec rake past_days:earning(エラーなしで Rake を実行) を実行すると、すべて正常に動作しますが、これを実行すると

rails console添付のスクリーンショットを参照してください

ここに画像の説明を入力

エラーが発生NameError: uninitialized constant DailyEarningし、上記のスクリーンショットに見られるように手動でファイルを要求しました

したがって、上記のすべての質問のポイントは、rails console (NameError: uninitialized constant DailyEarning) でエラーが発生する理由と、rake タスクでエラーが発生しない理由 です。

@dtt コメントに基づく DailyEarning コードの添付

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 に答える