Ruby on rails ActiveRecord.where(列:数组或字符串)-如何保持顺序?

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关系与原始数组

这个问题很像但是关于使用“where”和字符串ID数组

不幸的是,当我们收到一个JSON字符串(一个
ArchiveObject
通过一列
media
连接了媒体)时,我们的情况要复杂一些,例如:

这些对象中的每一个都存在于数据库中,但长话短说,我们不能使用它们基于整数的pk ID,因为我们的数据库不断地从XML数据导出中刷新和重写

目前,我们正在

  • 解析JSON
  • 映射“图像\u id”
  • 执行
    where
    查找相关对象
  • 代码:

    因此,我的问题是,是否有任何方法可以将生成的activerecord关系与原始数组
    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)