find_or_create_by_name_and_location создание дубликатов ActiveRecord в Rails - PullRequest
0 голосов
/ 24 октября 2011

Я новичок в rails (и вообще пишу код) и пишу небольшой проект с использованием RSpec для тестирования. В настоящее время я застрял на модельном тесте, который должен быть довольно простым, и я рву на себе волосы.

У меня есть файл журнала для анализа ошибок. Каждая ошибка имеет имя (например, NoMethodError) и местоположение (например, "app/controllers/public/profiles_controller.rb:46:in 'index'). Я успешно проанализировал их из журнала и сейчас пытаюсь записать их в мою базу данных Errors с помощью ActiveRecord.

Я хочу, чтобы каждая комбинация ошибки / местоположения была записана только один раз. В настоящее время я использую этот блок в моей модели для этого:

#app/models/error.rb
Error.find_or_create_by_name_and_location(@name, @location) do |error|
error.first_seen  = (Time.now - 1.day)
error.last_seen   = Time.now  # These time objects are just filler for now
end

Насколько я могу понять, это должно создать новую запись в моей Errors базе данных только , если не существует ранее существующей записи с тем же именем и местоположением. Однако это не так.

Я создал образец журнала для выполнения моих тестов, в котором есть две идентичные и одна уникальная пара ошибок / местоположений. Я хочу, чтобы они были записаны как 2 записи в Errors. Однако, когда я запускаю тест, дубликаты не отфильтровываются, поэтому я получаю 3 записи.

Я написал тест для проверки метода find_or_create_by_name_and_location, и он отлично работает:

#RSpec 
#spec/models/error_spec.rb
Error.find_or_create_by_name_and_location( "foo", "bar")
Error.find_or_create_by_name_and_location( "foo", "bar")
Error.should have(1).record
#Test passes

Я перепробовал все, что только мог придумать, но быстро добираюсь никуда, поэтому любая помощь будет очень признательна!

1 Ответ

1 голос
/ 25 октября 2011

Вы должны добавить проверку к вашей модели, чтобы обеспечить уникальность, независимо от того, работает ли метод find_or_create_by, как вы ожидаете.

class Error << ActiveRecord::Base

  validates_uniqueness_of :name, :scope => :location

end

Таким образом, может быть только одна запись сто же имя и местоположение.

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