Ruby on rails ActiveRecord.where(列:数组或字符串)-如何保持顺序?
这个问题很像但是关于使用“where”和字符串ID数组 不幸的是,当我们收到一个JSON字符串(一个Ruby on rails ActiveRecord.where(列:数组或字符串)-如何保持顺序?,ruby-on-rails,json,activerecord,sinatra,Ruby On Rails,Json,Activerecord,Sinatra,这个问题很像但是关于使用“where”和字符串ID数组 不幸的是,当我们收到一个JSON字符串(一个ArchiveObject通过一列media连接了媒体)时,我们的情况要复杂一些,例如: 这些对象中的每一个都存在于数据库中,但长话短说,我们不能使用它们基于整数的pk ID,因为我们的数据库不断地从XML数据导出中刷新和重写 目前,我们正在 解析JSON 映射“图像\u id” 执行where查找相关对象 代码: 因此,我的问题是,是否有任何方法可以将生成的activerecord关系与原始数组
ArchiveObject
通过一列media
连接了媒体)时,我们的情况要复杂一些,例如:
这些对象中的每一个都存在于数据库中,但长话短说,我们不能使用它们基于整数的pk ID,因为我们的数据库不断地从XML数据导出中刷新和重写
目前,我们正在
where
查找相关对象image\u id
排序?或者,如果我可以循环查看image\u id
,是否有办法通过关系中的某个列值高效地访问该对象
额外说明:
我们在映射和
where
时遇到这些麻烦的原因是,每个图像都有一个标题、url等存储在自己的行中,而这些标题、url等不存在于其父对象的media
列中,从而防止对每个图像进行数据库查找,我们试图将其全部编译成一个DB调用。我不确定我的答案是否不是特定于postgresql的,但在我的项目中,我遇到了同样的问题
尝试下面的解决方案
images = JSON.parse(current_archive_object.media)
image_ids = images.map { |image| image['image_id'] }
order = "position(image_id::text in '#{image_ids.join(',')}')"
images = ArchiveObject.where(image_id: image_ids).order(order)
希望能有所帮助。我不确定我的答案是否与postgresql无关,但在我的项目中,我也遇到了同样的问题 尝试下面的解决方案
images = JSON.parse(current_archive_object.media)
image_ids = images.map { |image| image['image_id'] }
order = "position(image_id::text in '#{image_ids.join(',')}')"
images = ArchiveObject.where(image_id: image_ids).order(order)
希望有帮助。感谢您的回复,不幸的是我收到了
PG::UnfinedColumn:错误:列“ABCD1234”不存在
,控制台中的postgresql语句(简化)选择“存档对象”。*从“存档对象”中选择“存档对象”。'image\u id'位于('ABCD1234'、'ABCD3456'、'ABCD4567'))按图像排序\u id=ABCD4567 DESC,图像\u id=ABCD1234,图像\u id=ABCD3456
使用另一个排序功能更新了我的答案。尝试一下。感谢您的响应,不幸的是我收到了PG::UnfinedColumn:ERROR:列“ABCD1234”不存在
,控制台中的postgresql语句(简化)选择“存档对象”。*从“存档对象”中选择“存档对象”。'image\u id'在('ABCD1234','ABCD3456','ABCD4567'))按图像排序\u id=ABCD4567 DESC,图像\u id=ABCD1234,图像\u id=ABCD3456
使用另一个排序功能更新了我的答案。试试看。
images = JSON.parse(current_archive_object.media)
image_ids = images.map { |image| image['image_id'] }
order = "position(image_id::text in '#{image_ids.join(',')}')"
images = ArchiveObject.where(image_id: image_ids).order(order)