【发布时间】:2021-11-23 20:58:49
【问题描述】:
这是我想做的:
Aquarium
.select(:id, :name, :yr_built, 'fishes.name')
.joins(:fishes)
.where(fishes: {name: "Nemo"})
.order('fishes.bday DESC')
这目前按预期工作,因为我输入了原始 SQL 代码。但是,因为有人告诉我使用原始 SQL 是一种不好的做法,并且会让您容易受到漏洞的影响,所以我想使用正确的 ActiveRecord 语法重构 select 和 order 行。
我知道在.where 中,您可以使用table_name: {column_name: "value"} 语法从连接表中查找值。而且我知道,如果我想按 aquariums 表中的列排序,我可以这样做:.order(col_name: :desc),因为 aquariums 是开头的表。但是当我尝试像这样将它添加到.order 时,这似乎不起作用:.order(fishes: {bday: :desc})
我也不确定如何从原始 SQL 转换 .select 中的 'fishes.name',因为它也来自连接表。
【问题讨论】:
-
此查询实际上不会按您希望的方式工作。由于您要加入一个包含许多行的表,因此它非常模棱两可。
'fishes.name'应该包含什么?第一条鱼的名字?最后一个?他们都是?如果是这样,它应该是什么数据类型?例如,Postgres 不允许此查询,您需要使用array_agg或json_agg之类的聚合函数来获取名称数组。
标签: sql ruby-on-rails activerecord ruby-on-rails-5