请求将SQL查询转换为Rails Active Record查询
请求将SQL查询转换为Rails Active Record查询
没问题,这就帮你把这两段SQL转换成和原语句完全匹配的Rails Active Record查询,结合你提到的Station has many Connectors的关联关系,两种写法都给你列出来:
1. 对应Station的查询
原SQL:
SELECT "stations".* FROM "stations" WHERE "stations"."id" = $1 LIMIT $2 [["id", "f8cc6584-9794-4863-9e3a-7ac05a1b5d46"], ["LIMIT", 1]]
Active Record写法:
# 最简洁的方式,find方法默认会添加LIMIT 1,生成的SQL和你给出的完全一致 Station.find("f8cc6584-9794-4863-9e3a-7ac05a1b5d46") # 如果你想更明确写出limit条件,也可以这么写,效果完全一样 Station.where(id: "f8cc6584-9794-4863-9e3a-7ac05a1b5d46").limit(1).first
2. 对应Connectors的查询
原SQL:
SELECT "connectors".* FROM "connectors" WHERE "connectors"."station_id" = $1 AND "connectors"."id" IN ($2, $3) [["station_id", "f8cc6584-9794-4863-9e3a-7ac05a1b5d46"], ["id", "a476c0a6-bccb-42c7-935f-541031344860"], ["id", "e8e8e80b-6f73-4a66-9345-ae59a042b56d"]]
因为Station和Connectors是一对多关联,有两种推荐的写法:
- 通过关联对象查询(更符合Rails约定):
先拿到对应的Station对象,再通过关联查询指定id的Connectors:station = Station.find("f8cc6584-9794-4863-9e3a-7ac05a1b5d46") station.connectors.where(id: ["a476c0a6-bccb-42c7-935f-541031344860", "e8e8e80b-6f73-4a66-9345-ae59a042b56d"]) - 直接查询Connector模型:
如果你已经知道station_id的值,也可以直接写条件查询:Connector.where( station_id: "f8cc6584-9794-4863-9e3a-7ac05a1b5d46", id: ["a476c0a6-bccb-42c7-935f-541031344860", "e8e8e80b-6f73-4a66-9345-ae59a042b56d"] )
这两种写法生成的SQL都会和你给出的完全一致,你可以根据实际场景选择合适的方式~
备注:内容来源于stack exchange,提问作者user5922898
相关产品推荐
相关产品推荐

