简体   繁体   English

将Postgres查询转换为Rails活动记录

[英]Converting postgres query to rails active record

postgres# select * from something; postgres# 从某事中选择*;

id | id | name | 名称| random_id | random_id |
location | 位置|
created_at | created_at | updated_at | Updated_at | type | 类型
details 细节

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

15 | 15 | one | 一| 6abddaba-6b6e-4433-ae3b-698a16971704 | 6abddaba-6b6e-4433-ae3b-698a16971704 | somehttp://one.tar.xz | 一些http://one.tar.xz | 2017-05-02 06:55:36.146826 | 2017-05-02 06:55:36.146826 | 2017-05-02 06:55:48.154355 | 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": []} {“ os”:[{“ release”:“ Fedora”}],“ openstack_version”:[{“ buildhost”:“ openstack.com”,“ package_name”:“ nova”,“ package_version”:1.2,“ openstack_version” :8}],“体系结构”:[{“内核”:“ x86_64”}],“ volume_drivers”:[{“驱动程序”:“ ABCDriver”}],“ network_drivers”:[],“ network_plugins”:[] ,“ shared_file_system_drivers”:[]}

16 | 16 | two | 二| 9b13fb4c-2e20-4336-b486-473b50948ee1 | 9b13fb4c-2e20-4336-b486-473b50948ee1 | somehttp://two.tar.xz | 一些http://two.tar.xz | 2017-05-02 06:55:52.219204 | 2017-05-02 06:55:52.219204 | 2017-05-02 06:56:03.212226 | 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": []} {“ os”:[{“ release”:“ Fedora”}],“ openstack_version”:[{“ buildhost”:“ openstack.com”,“ package_name”:“ nova”,“ package_version”:1.2,“ openstack_version” :8}],“体系结构”:[{“内核”:“ x86_64”}],“ volume_drivers”:[{“驱动程序”:“ XYZDriver”}],“ network_drivers”:[],“ network_plugins”:[] ,“ shared_file_system_drivers”:[]}

17 | 17 | three | 三| 119eaf5f-166d-4ddd-a4db-d1f56bbf8779 | 119eaf5f-166d-4ddd-a4db-d1f56bbf8779 | somehttp://three.tar.xz | 一些http://three.tar.xz | 2017-05-02 06:56:58.009536 | 2017-05-02 06:56:58.009536 | 2017-05-02 06:57:06.538191 | 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": []} {“ 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”:“ linuxbridge”}],“ network_plugins”:[{ “ plugins”:“ ml2”}],“ shared_file_system_drivers”:[]}

19 | 19 | four | 四| 139eaf5f-166d-4ddd-a4db-d1f56bbf8779 | 139eaf5f-166d-4ddd-a4db-d1f56bbf8779 | somehttp://four.tar.xz | 一些http://four.tar.xz | 2017-05-02 06:56:58.009536 | 2017-05-02 06:56:58.009536 | 2017-05-02 06:57:06.538191 | 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": []} {“ 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”:[]}

I wanted to find entries in the table named "something" where "volume_drivers" could be "ABCDriver" or "XYZDriver" and network_drivers could be "linuxbridge". 我想在名为“ something”的表中找到条目,其中“ volume_drivers”可以是“ ABCDriver”或“ XYZDriver”,而network_drivers可以是“ linuxbridge”。

So, my result should consist of entries with id 15,16,17 as per above conditions. 因此,根据上述条件,我的结果应包含ID为15、16、17的条目。

I tried doing the same using postgres shell and it worked, however, I am not able to map the same postgres query to ruby. 我尝试使用postgres shell进行同样的操作,但它确实有效,但是,我无法将相同的postgres查询映射到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 :( 我尝试如下所示,以获取ABCDriver的条目,但一无​​所获:(

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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