Странная ошибка из ActiveRecord (возможно) - PullRequest
0 голосов
/ 11 марта 2010

Моя среда разработки:

  • 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

Не сбой в консоли.

Ответы [ 3 ]

0 голосов
/ 12 марта 2010

Поскольку область действия sample_summaries по умолчанию включает образцы, вы можете попробовать:

def fetch_locations(loc_names)
  ls = Location.find(:all, 
    :conditions => {:locations => {:name => loc_names}, 
    :include => :sample_summaries
  )
end

Кроме того, произойдет ли сбой, если вы не включите: include off?

0 голосов
/ 12 марта 2010

Вот что происходит:

https://rails.lighthouseapp.com/projects/8994/tickets/1339-arbase-should-not-be-nuking-its-children-just-because-it-lost-interest

Хорошая новость в том, что это происходит только в режиме разработки (где config.cache_classes = false). Изменение его на true заставит его исчезнуть (ценой не забывая перезапускать сервер после каждого изменения).

0 голосов
/ 12 марта 2010

Итак, если вы запустите это через ./script/console (соответствующая часть действия контроллера) несколько раз с одними и теми же аргументами, это случайно произойдет сбой? Или это постоянно терпит неудачу? Это не ясно.

Просто случайно, почему бы не попробовать ...

ls = Location.find (: все, : условие => ["location.name in (?)", loc_names], : include =>: sample_summaries => {: samples})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...