我怎样才能让 Rails 5 与其中有一个句点的主键一起玩?

How can I get Rails 5 to play nicely with a primary key that has a period in it?

我正在使用一个我无法控制且无法更改的数据库。此数据库有一个名为 warehouse_items 的 table。每个仓库项目都由表示项目 ID 的主键唯一标识。

不幸的是,那个主键属性被命名为 WAREHOUSE_ITEM.ID

(注意“item”和“id”之间令人讨厌的句点)


当我尝试运行一个基本查询时,例如:

WarehouseItem.find('wh3453')

我收到一个 未定义 Table 错误。

幸运的是,当查看 Rails 试图做什么时,问题变得很明显:

: SELECT  "warehouse_items".* FROM "warehouse_items" WHERE "WAREHOUSE_ITEM"."ID" =  LIMIT 

由于属性名称中的句点,Rails 将“WAREHOUSE_ITEM.ID”视为 table/attribute 组合,而不是带有句点的属性名称。

当我手动 运行 以下 PSQL 查询时,我得到了我所需要的:

SELECT  "warehouse_items".* FROM "warehouse_items" WHERE "warehouse_items"."WAREHOUSE_ITEM.ID" = 'wh3453'

为什么 Rails 搞砸了,我该如何解决?


编辑:

同样值得注意的是:我尝试使用 self.primary_key 覆盖主键但无济于事。

我试过字符串和符号,如:

self.primary_key="WAREHOUSE_ITEM.ID"

self.primary_key=:"WAREHOUSE_ITEM.ID"

没有一个工作过...

感谢大家的帮助!

评论中使用 find_by_sql 的建议确实有效!但是,我偶然发现了一个效果更好的不同解决方案。

首先,我将烦人的属性名称别名为简单的别名:id

alias_attribute :id, :"WAREHOUSE_ITEM.ID"

注意它仍然是一个符号,这对下一步很重要。

然后我用自定义函数覆盖 primary_key 方法:

  def self.primary_key
    return "id"
  end

现在,当我执行 WarehouseItem.find('wh3453') 时,Rails 默认检查 id,它是正确符号的别名并且按预期工作!!!