这是我想要做的:
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"}
语法从连接表中查找值。我知道,如果我想按水族箱表中的列排序,我可以这样做:.order(col_name: :desc)
,因为水族馆是以开头的表。但是当我尝试像这样将它添加到.order
中时,这似乎不起作用:.order(fishes: {bday: :desc})
我也不确定如何从原始'fishes.name'
中转换.select
中的SQL,因为它也来自joins表。
发布于 2021-10-02 12:49:39
在您的解决方案中没有任何风险。即使您正在为ActiveRecord使用一些字符串参数,也没有地方可以将SQL注入放在那里。只需将'fishes.name'
更改为'fishes.name AS fish_name'
即可在结果中保留这两个名称。
但是,如果你更喜欢SQL-string-free解决方案(就像我一样),你可以使用Arel而不是白色,就像这样。
Aquarium
.joins(:fishes)
.select(:id, :name, :yr_built, Fish.arel_table[:name].as('fish_name'))
.where(fishes: { name: 'Nemo'})
.order(Fish.arel_table[:updated_at].desc)
https://stackoverflow.com/questions/69418965
复制相似问题