当foreign_key为字符串时遗留数据的rails关联
Posted
技术标签:
【中文标题】当foreign_key为字符串时遗留数据的rails关联【英文标题】:rails association for legacy data when foreign_key is string 【发布时间】:2019-01-04 22:55:02 【问题描述】:我有一个不幸的任务是让一些遗留数据与 rails ap 一起工作。一些id字段是字符串
:client_id => "30430"
但是在 postgres(我们更喜欢使用它)中,关联查询由于数据类型不匹配而阻塞。有没有解决的办法?
PG::UndefinedFunction: ERROR: operator does not exist: bigint = character varying LINE 1: ...ients" INNER JOIN "reservation" ON "clients"."id" = "reserva...
No operator matches the given name and argument type(s). You might need to add explicit type casts.
明确地说,我正在寻找不涉及更改基础数据的解决方案(尽管那将是我的首选)
【问题讨论】:
【参考方案1】:起初我以为你可以编写一个迁移来将列类型转换为整数,这适用于 mysql 但显然不适用于 postgres:
https://makandracards.com/makandra/18691-postgresql-vs-rails-migration-how-to-change-columns-from-string-to-integer
假设您的表被称为产品,以下应该可以工作:
change_column :products, :client_id, 'integer USING CAST(column_name AS integer)'
正如链接所述,任何具有非数值的字符串显然会给出奇怪的结果,如果不抛出错误的话。显然值得先在本地尝试。
【讨论】:
抱歉,我无法直接更改数据。但我已经把这个请求推到了指挥链上…… 我猜你可以手动写出关联 - 而不是 belongs_to :client,写出一个返回匹配字符串 ID 记录的客户端方法 是的,但我其实也有Departure有很多客户,通过预订。以上是关于当foreign_key为字符串时遗留数据的rails关联的主要内容,如果未能解决你的问题,请参考以下文章
为啥 SQLite pragma foreign_keys 在数据库连接中不持久?
Laravel 6 PHPUnit 测试 - 找不到驱动程序(SQL:PRAGMA foreign_keys = ON;)
您是不是会将 NHibernate 用于具有部分无法控制的遗留数据库的项目?