【发布时间】:2014-10-05 20:03:18
【问题描述】:
我有三个 rails 对象:User、DemoUser 和 Stats。 User 和 DemoUser 都有许多与之相关的统计数据。 User 和 Stats 表存储在 Postgresql 上(使用 ActiveRecord)。 DemoUser 存储在 redis 中。 DemoUser 的 id 是一个(随机)字符串。 User 的 id 是一个(标准轨道)递增整数。
stats 表有一个user_id 列,其中可以包含User id 或DemoUser id。因此,user_id 列是一个字符串,而不是一个整数。
没有一种简单的方法可以将随机字符串转换为整数,但有一种非常简单的方法可以将整数 id 转换为字符串 (42 -> "42")。 保证这些 id 不会重叠(永远不会有与 DemoUser 具有相同 id 的 User 实例)。
我有一些管理这些统计数据的代码。我希望能够传递some_user 实例(可以是DemoUser 或User),然后能够使用id 获取Stats,更新它们等。能够为User 模型定义has_many 也很好,所以我可以做user.stats 之类的事情
但是,user.stats 之类的操作会创建类似的查询
SELECT "stats".* FROM "stats" WHERE "stats"."user_id" = 42
然后与 PG::UndefinedFunction: ERROR: operator does not exist: character varying = integer 中断
有没有办法让数据库(Postgresql)或 Rails 自动翻译 JOIN 时的 id?(从整数到字符串的翻译应该很简单,例如 42 -> "42" )
编辑:更新了问题以尽量使事情清楚。很高兴接受编辑或回答问题以澄清任何事情。
【问题讨论】:
-
stats.user_id也是一个字符串不是更有意义吗?然后你的数据库就有意义了,你的问题就会消失。 -
stats.user_id是一个字符串...而且我不想将user.id更改为一个字符串,否则它可能会产生一大堆无法预料的问题... -
所以
stats.user_id是一个字符串,它与来自其他数据库的字符串id匹配。但是您不想将users.id更改为字符串,即使它确实是来自其他数据库的字符串?更改它以匹配现实并处理副作用。如果外部id最终变成'4ed6aa9f30f1b90927000001'或其他一些非数字字符串会怎样?您的架构必须与您的数据相匹配,否则您将遇到一大堆混乱。要么在任何地方使用外部ids(使用正确的类型),要么需要一个表格来映射它们。 -
我认为你误解了一些事情。也许我没有正确解释?
stats.user_id是一个字符串,它可以是"234"(匹配234的users.id),也可以是一个外部字符串"abc",它匹配同一代码库中使用的NoSQL 数据库上的ID。 -
我认为您需要更好地描述您的数据。如果您真的想在一列中存储两种完全不同的东西,那么您手头上就会一团糟。
标签: ruby-on-rails postgresql foreign-keys nosql