简体   繁体   中英

Converting postgres query to rails active record

postgres# select * from something;

id | name | random_id |
location |
created_at | updated_at | type |
details

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

15 | one | 6abddaba-6b6e-4433-ae3b-698a16971704 | somehttp://one.tar.xz | 2017-05-02 06:55:36.146826 | 2017-05-02 06:55:48.154355 | openstack | {"os": [{"release": "Fedora"}], "openstack_version": [{"buildhost": "openstack.com", "package_name": "nova", "package_version": 1.2, "openstack_version": 8}], "architecture": [{"kernel": "x86_64"}], "volume_drivers": [{"drivers": "ABCDriver"}], "network_drivers": [], "network_plugins": [], "shared_file_system_drivers": []}

16 | two | 9b13fb4c-2e20-4336-b486-473b50948ee1 | somehttp://two.tar.xz | 2017-05-02 06:55:52.219204 | 2017-05-02 06:56:03.212226 | openstack | {"os": [{"release": "Fedora"}], "openstack_version": [{"buildhost": "openstack.com", "package_name": "nova", "package_version": 1.2, "openstack_version": 8}], "architecture": [{"kernel": "x86_64"}], "volume_drivers": [{"drivers": "XYZDriver"}], "network_drivers": [], "network_plugins": [], "shared_file_system_drivers": []}

17 | three | 119eaf5f-166d-4ddd-a4db-d1f56bbf8779 | somehttp://three.tar.xz | 2017-05-02 06:56:58.009536 | 2017-05-02 06:57:06.538191 | openstack | {"os": [{"release": "Fedora"}], "openstack_version": [{"buildhost": "openstack.com", "package_name": "nova", "package_version": 1.3, "openstack_version": 9}], "architecture": [{"kernel": "x86_64"}], "volume_drivers": [], "network_drivers": [{"drivers": "linuxbridge"}], "network_plugins": [{"plugins": "ml2"}], "shared_file_system_drivers": []}

19 | four | 139eaf5f-166d-4ddd-a4db-d1f56bbf8779 | somehttp://four.tar.xz | 2017-05-02 06:56:58.009536 | 2017-05-02 06:57:06.538191 | openstack | {"os": [{"release": "Fedora"}], "openstack_version": [{"buildhost": "openstack.com", "package_name": "nova", "package_version": 1.3, "openstack_version": 9}], "architecture": [{"kernel": "x86_64"}], "volume_drivers": [], "network_drivers": [{"drivers": "bridge"}], "network_plugins": [{"plugins": "pqrst"}], "shared_file_system_drivers": []}

I wanted to find entries in the table named "something" where "volume_drivers" could be "ABCDriver" or "XYZDriver" and network_drivers could be "linuxbridge".

So, my result should consist of entries with id 15,16,17 as per above conditions.

I tried doing the same using postgres shell and it worked, however, I am not able to map the same postgres query to ruby.

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

I tried as below to at leat get the entry for ABCDriver and got nothing :(

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

Also, if someone has better suggestion to retrieve the same let me know.

Try this code:

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"}]'))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM