我怎样才能让 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
,它是正确符号的别名并且按预期工作!!!
我正在使用一个我无法控制且无法更改的数据库。此数据库有一个名为 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
,它是正确符号的别名并且按预期工作!!!