Полиморфная ассоциация вставляет 0 вместо повышения ошибки, когда столбец неправильно сконфигурирован как Integer

Здесь тот, который натолкнул меня на некоторое время, хотя в ретроспективе это должно было быть очевидно. Я получил сообщение об ошибке

NoMethodError: undefined method `constantize' for 0:Fixnum

при доступе к модели через полиморфную ассоциацию. Оказывается, таблица на стороне belongs_to ассоциации имела целочисленный столбец type вместо строки.

Легко исправлено, но кажется, что Rails должна поднять ошибку в этой ситуации - вместо этого она удачно добавляет строку с 0 в столбце типа.

Ответы

Ответ 1

Это происходит потому, что параметры, отправленные с запросами, передаются как строки, и поэтому для целых столбцов, которые заданы из параметров, rails вызывает to_i в строке, чтобы получить целое число. Если он не может решить целое из него (что происходит, если строка не начинается с некоторых цифр), то to_i возвращает 0. Это как раз работает ruby. Иногда рельсы обнаруживают это и вызывают предупреждение, но он не может знать имя каждого столбца, который он должен проверить. Например, проверьте это (с консоли)

>> quiz = Quiz.first
=> <a quiz>
>> quiz.user_id = "foo"
=> "foo"
>> quiz.save
=> true
>> quiz.user_id
=> 0

Ответ 2

В моем случае modeltable_type не был string type, это решило мою проблему.