Rails 2.3.8: ошибки при извлечении записей, поскольку MySQL нечувствителен к регистру, а Rails чувствителен к регистру - PullRequest
1 голос
/ 28 июня 2011

У меня есть 2 модели с отношением один-к-одному (пример упрощенный, а не реальные модели).

class Person < ActiveRecord::Base
  belongs_to :student, :foreign_key => 'name', :primary_key => 'full_name'
end

class Student < ActiveRecord::Base
  belongs_to :person, :foreign_key => 'full_name', :primary_key => 'name'
end

Связь между ними является слабой, поскольку можно изменить поле full_name в объекте Student, а затем объект person не может быть достигнут из объекта Student.

Пока все хорошо (это специально).

Проблема возникает, когда имя человека совпадает с полным именем_эквивалента учащегося, но отличается в случае букв.

Запрос для БД MySQL возвращает результат (так как MySQL нечувствителен к регистру), но когда Rails запускает результат, он не находит его (поскольку Rails чувствителен к регистру), что приводит к ошибке при активной загрузке ассоциации. Пример трассировки стека ошибки:

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.each):
  vendor/rails/activerecord/lib/active_record/association_preload.rb:155:in `set_association_single_records'
...

Я предполагаю, что это ошибка в Rails 2.3.8. Есть ли простое решение этой проблемы?

Спасибо!

1 Ответ

4 голосов
/ 29 июня 2011

Нет, это не ошибка Rails или ошибка Ruby - строки Ruby чувствительны к регистру, поэтому не следует ожидать, что это будет работать как есть.

Это плохой дизайн базы данных, но если вы хотите продолжать идти по этому пути безумия, добавьте отдельный столбец lower_name к каждой таблице, имя которой вынуждается вводить строчные буквы, и используйте ее в качестве ссылки на ассоциацию AR. (Самое чистое решение - установить фильтр before_save на каждую модель, чтобы обновлять lower_name при изменении имени.)

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