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