gpt4 book ai didi

mysql - rails 2.3.8 : Errors in fetching records since MySQL is case-insensitive and Rails is case-sensitive

转载 作者:行者123 更新时间:2023-11-29 04:56:07 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com