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

标签 mysql ruby-on-rails activerecord case-sensitive

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

相关文章:

MYSQL 删除字符串中的第一个逗号

mysql - 如何使用sql查询将同一字段分组在一个字段下

ruby-on-rails - 如果我使用 Cloudflare 的 "Full SSL",是否需要为 Heroku 购买另一个 SSL 证书?

ruby-on-rails - Rails - 是两个日期之间的日期吗?

ruby-on-rails - 在 VPN 上访问数据库

mysql - 从每个团队中获取最多 2 个用户,结果最好 MYSQL

mysql循环访问数据库的性能

ruby-on-rails - 如何测试rspec中的路由错误?

ruby-on-rails - rails 迁移 : Bigint on PostgreSQL seems to be failing?

php - CodeIgniter:如果 Active Record 找不到任何数据,则返回 FALSE