我有三个rails对象:User
,DemoUser
和Stats
。 User
和DemoUser
都有许多与它们相关的统计数据。 User
和Stats
表存储在Postgresql上(使用ActiveRecord)。 DemoUser
存储在redis中。 DemoUser
的id是一个(随机)字符串。 User
的id是一个(标准轨道)递增整数。Rails has_many带整数主键和字符串外键
stats
表具有user_id
列,该列可以包含User
id或DemoUser
id。出于这个原因,user_id
列是一个字符串,而不是一个整数。
有没有一种简单的方法来从随机字符串转换为整数,但有一个非常简单的方法来将整数id转换为字符串(42 -> "42"
)。该ID是保证不重叠(将不会有User
实例与以前相同的id作为DemoUser
)。
我有一些代码来管理这些统计信息。我希望能够通过一个some_user
实例(可以是DemoUser
或User
),然后能够使用id
来获取Stats
,更新它们等。同样会很高兴能够定义一个has_many
为User
模型,所以我可以做的事情一样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'也不是一个字符串吗?那么你的数据库就会有意义,你的问题就会消失。 – 2014-10-05 20:22:29
'stats.user_id'是一个字符串...我不想将'user.id'更改为一个字符串,或者它可能会创建一个无法预料的问题... – gingerlime 2014-10-05 20:38:52
因此'stats.user_id'是一个字符串,它与来自其他数据库的字符串“id”匹配。但是你不想把'users.id'改成一个字符串,即使它真的是一个来自你的其他数据库的字符串?改变它以符合现实并处理副作用。如果外部'id'结束为'4ed6aa9f30f1b90927000001''或其他非数字字符串?您的模式**必须**符合您的数据,否则您只会有一大堆混乱。要么你在任何地方都使用外部'id's(使用适当的类型),要么你需要一张表来映射它们。 – 2014-10-05 20:47:49