【问题标题】:rails association for legacy data when foreign_key is string当foreign_key为字符串时遗留数据的rails关联
【发布时间】: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.

明确地说,我正在寻找不涉及更改基础数据的解决方案(尽管那将是我的首选)

【问题讨论】:

    标签: ruby-on-rails associations legacy


    【解决方案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有很多客户,通过预订。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多