Полиморфная ассоциация вставляет 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
, это решило мою проблему.