当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;)

在 Grails 中映射遗留数据库表时避免表更改?

您是不是会将 NHibernate 用于具有部分无法控制的遗留数据库的项目?

记事本里出现该文件含有Unicode格式的字符,当保存为ANSI编码的文本时,该字符将丢失。怎么回事啊??

在javascript中将单词拆分为音节