【问题标题】:Converting postgres query to rails active record将 postgres 查询转换为 Rails 活动记录
【发布时间】:2017-05-09 14:05:59
【问题描述】:

postgres# select * from something;

标识 |姓名 |随机 ID |
位置 |
created_at |更新时间 |类型 |
详情

----+----------+------------------------------- --------+------------------------------ -------------------------------------------------- -----------------------------------------+-------- --------+----------------+-----------+ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------------------

15 |一个 | 6abddaba-6b6e-4433-ae3b-698a16971704 |一些http://one.tar.xz | 2017-05-02 06:55:36.146826 | 2017-05-02 06:55:48.154355 |开放堆栈 | {"os": [{"release": "Fedora"}], "openstack_version": [{"buildhost": “openstack.com”,“package_name”:“nova”,“package_version”:1.2, “openstack_version”:8}],“架构”:[{“内核”:“x86_64”}], “volume_drivers”:[{“drivers”:“ABCDriver”}],“network_drivers”:[], “network_plugins”:[],“shared_file_system_drivers”:[]}

16 |二 | 9b13fb4c-2e20-4336-b486-473b50948ee1 |一些http://two.tar.xz | 2017-05-02 06:55:52.219204 | 2017-05-02 06:56:03.212226 |开放堆栈 | {"os": [{"release": "Fedora"}], "openstack_version": [{"buildhost": “openstack.com”,“package_name”:“nova”,“package_version”:1.2, “openstack_version”:8}],“架构”:[{“内核”:“x86_64”}], “volume_drivers”:[{“drivers”:“XYZDriver”}],“network_drivers”:[], “network_plugins”:[],“shared_file_system_drivers”:[]}

17 |三 | 119eaf5f-166d-4ddd-a4db-d1f56bbf8779 | 一些http://three.tar.xz | 2017-05-02 06:56:58.009536 | 2017-05-02 06:57:06.538191 |开放堆栈 | {“操作系统”:[{“发布”: "Fedora"}], "openstack_version": [{"buildhost": "openstack.com", “package_name”:“nova”,“package_version”:1.3,“openstack_version”: 9}],“架构”:[{“内核”:“x86_64”}],“volume_drivers”:[], “network_drivers”:[{“drivers”:“linuxbridge”}],“network_plugins”: [{"plugins": "ml2"}], "shared_file_system_drivers": []}

19 |四 | 139eaf5f-166d-4ddd-a4db-d1f56bbf8779 |一些http://four.tar.xz | 2017-05-02 06:56:58.009536 | 2017-05-02 06:57:06.538191 |开放堆栈 | {"os": [{"release": "Fedora"}], "openstack_version": [{"buildhost": “openstack.com”,“package_name”:“nova”,“package_version”:1.3, “openstack_version”:9}],“架构”:[{“内核”:“x86_64”}], “volume_drivers”:[],“network_drivers”:[{“drivers”:“bridge”}], “network_plugins”:[{“plugins”:“pqrst”}], “shared_file_system_drivers”:[]}

我想在名为“something”的表中查找条目,其中“volume_drivers”可以是“ABCDriver”或“XYZDriver”,network_drivers 可以是“linuxbridge”。

因此,根据上述条件,我的结果应包含 id 为 15、16、17 的条目。

我尝试使用 postgres shell 执行相同的操作,并且成功了,但是,我无法将相同的 postgres 查询映射到 ruby​​。

select * from something where details->'volume_drivers' IN ('[{"drivers": "ABCDriver"}]','[{"drivers": "XYZDriver"}]')                                                  OR details->'network_drivers' IN ('[{"drivers": "linuxbridge"}]');

我尝试如下至少获取 ABCDriver 的条目但一无所获:(

Something.where('details->volume_drivers @> ?', [{"drivers": "ABCDriver"}]);

另外,如果有人有更好的建议来检索相同的内容,请告诉我。

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    试试这个代码:

    Something.where("details->>'volume_drivers' IN (?)", 
      [[{"drivers": "ABCDriver"}], [{"drivers": "XYZDriver"}]].map(&:to_json))
    
    # result sql 
    SELECT  "somethings".* FROM "somethings" 
    WHERE (details->>'volume_drivers' IN
            ('[{"drivers":"ABCDriver"}]','[{"drivers":"XYZDriver"}]'))
    

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      • 2018-07-11
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多