Моя среда разработки:
- Ubuntu 9
- Рубин 1.9.1 / 1.8.7 (rvm)
- Рельсы 2.3.5
- Mysql 5,0
- Apache Passenger
Ниже приведена часть потока программы для представления проблемы.
Запрос приходит:
#action
def create
begin
@report = Report.new(params[:report])
...
rescue LocationNotFound => e
...
end
end
Конструктор отчетов:
class Report
attr_accessor :locations
def initialize(params = {})
@locations = params[:locations] ? fetch_locations(params[:locations]) : []
end
...
end
fetch_locations:
def fetch_locations(loc_names)
Rails.logger.debug "LOC_NAMES: " + loc_names.inspect
ls = Location.find(:all, :conditions => [ # line 57
"locations.name in (#{loc_names.map{'?'}.join(',')})",
*loc_names
], :include => [:sample_summaries, :samples]) # loc_names will never be empty
...
end
Модель местоположения:
class Location < ActiveRecord::Base
has_many :sample_summaries
has_many :samples, :through => :sample_summaries
...
end
Теперь в первый раз (после перезапуска пассажира) все работает нормально и выполняет свою работу. В большинстве случаев я получаю ошибку:
Mar-11 11:01:00 #15098 DEBUG: LOC_NAMES: ["Moscow, RF", "London, UK"]
Mar-11 11:01:00 #15098 DEBUG: Location Load (0.0ms) SELECT * FROM `locations` WHERE (locations.name in ('Moscow, RF','London, UK'))
Mar-11 11:01:00 #15098 DEBUG: SampleSummary Load (0.0ms) SELECT `sample_summaries`.* FROM `sample_summaries` WHERE (`sample_summaries`.location_id IN (1,3))
Mar-11 11:01:00 #15098 DEBUG: SampleSummary Columns (0.0ms) SHOW FIELDS FROM `sample_summaries`
Mar-11 11:01:00 #15098 FATAL:
NoMethodError (You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.include?):
app/models/report.rb:57:in `fetch_locations'
app/models/report.rb:9:in `initialize'
app/controllers/report_controller.rb:11:in `new'
app/controllers/report_controller.rb:11:in `create'
Выглядит довольно случайно для меня. Есть идеи?
P.S. Я также пытался обернуть запрос в блок uncached
, но это ничего не изменило.
EDIT
Вот как выглядит модель SampleSummary:
class SampleSummary < ActiveRecord::Base
has_many :samples
belongs_to :location
... #validations
default_scope :include => :samples, :order => 'rss_ts desc'
...
end
EDIT2
Не сбой в консоли.