我有 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
它们之间的联系是一个薄弱环节,因为可以更改 Student 对象中的 full_name 字段,然后无法从 student 对象访问 person 对象。
到目前为止一切顺利(这是设计使然)。
当一个人的名字与同等学生的全名相同,但字母大小写不同时,就会出现问题。
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 错误。 这个问题有简单的解决方案吗?
谢谢!
最佳答案
不,这不是 Rails 错误或 Ruby 错误 - Ruby 字符串区分大小写,因此您不应期望它会按原样工作。
这是糟糕的数据库设计,但如果你想继续沿着这条疯狂的道路走下去,请在每个表中添加一个单独的列 lower_name
,并将名称强制小写,并将其用作你的 AR关联链接。 (最干净的解决方案是在每个模型上放置一个 before_save
过滤器,以便在名称更改时更新 lower_name
。)
关于mysql - rails 2.3.8 : Errors in fetching records since MySQL is case-insensitive and Rails is case-sensitive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6505475/