Странный ActiveRecord :: AssociationTypeMismatch - PullRequest
30 голосов
/ 10 мая 2011

Я получаю очень странную ошибку при запуске спецификации:

Failure/Error: entity = Factory.create(:entity, :name => "Test Entity", :creator => user)
 ActiveRecord::AssociationTypeMismatch:
   ::User(#97318850) expected, got User(#92770800)

Это код, который приводит к вышеуказанной ошибке. Фабрика - фабричная фабрика.

  user = Factory(:user, :username => "kai", :email => "xxx@yyy.com", :password => "testing")
  entity = Factory.create(:entity, :name => "Test Entity", :creator => user)

Когда я использую :creator => User.first, тогда все работает как положено. Я распечатал User.first и user, но не вижу разницы.

Любые предложения, что, черт возьми, здесь не так?

Обновление

Я также получил эту ошибку при запуске этой простой спецификации запроса

describe "Entities" do
  it "should succeed" do
    entity = Factory.create(:entity, :name => "Test Entity 1")
    visit root_path
  end

  it "should also succeed" do
    entity = Factory.create(:entity, :name => "Test Entity 2")
    property = Factory.create(:property, :entity => entity)
  end
end

На этот раз я получаю

Failure/Error: property = Factory.create(:property, :entity => entity)
 ActiveRecord::AssociationTypeMismatch:
   Entity(#103620190) expected, got Entity(#96047070)

когда я удаляю visit root_path все работает нормально (также при запуске каждой спецификации самостоятельно). Это просто кажется проблемой для спецификации запроса. Другие спецификации (модель, контроллер), кажется, работают нормально. Я использую Capybara 1.0.0.beta1 и RSpec 2.5.

Что означает это число за именем класса?

Ответы [ 5 ]

55 голосов
/ 11 мая 2011

Это ошибка, которая возникает, когда загружены две разные версии модели.Я использовал его в более старой версии Rails 3, так как перегрузчик модели среды разработки был слегка сбит с толку.Числа после имени класса относятся к разным версиям класса.

Разумеется, такого рода ошибки могут возникать в режиме разработки, но не в тестовом режиме, поскольку по умолчаниюклассы кешируются.См. Файл config/environments/test.rb, чтобы убедиться, что для cache_classes установлено значение true.

Также убедитесь, что вы используете последнюю версию Rails, 3.0.7.Это может быть ошибка, которая с тех пор была исправлена.Пока мы на этом, проверьте, что вы находитесь на factory_girl 1.3.3.При полностью правильном использовании API, который, я думаю, вы делаете, остается только одна возможность - что-то неправильно настроено или это ошибка в чужом коде.

5 голосов
/ 08 июня 2011

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

desired_object = foo.bar

Поиск элемента вместо этого устранил проблему и не требовал кэширования классов.

desired_object = Bar.find(foo.bar_id)

Я знаю, что это не такЭто идеально, но, возможно, это поможет кому-то выяснить, почему это вообще происходит.

1 голос
/ 11 августа 2014

Для комбинации Rails + Spring + factory_girl это исправлено начиная с версии v4.4.1 factory_girl_rails (февраль 2014 г.), см. https://github.com/thoughtbot/factory_girl_rails/pull/121

0 голосов
/ 11 февраля 2014

Проблема для меня заключалась в определении фабрики, где я использовал дополнительные фабрики для заполнения полей идентификаторов. Я случайно сослался на атрибут, которого не было в таблице (account, вместо account_id). Смотрите пример ниже.

factory Omni::CustomerAccount do
  sequence(:display_name) {|n| "test #{n}"}
  customer_id :customer  # this is correct
  account :account  # wrong - this should say account_id :account
end

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 26 января 2014

Подобная ошибка может возникнуть, если вы используете Spring или любой другой предварительный загрузчик приложения Rails , убедитесь, что вы перезапустите его.

spring stop
spring start
# or usually bin/rails s or bin/rails c for console
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...