select 使用 ActiveRecord 语法从 Rails 中的联接 table 中的列排序
select from or order by a column from the joins table in Rails using ActiveRecord syntax
这是我想要做的:
Aquarium
.select(:id, :name, :yr_built, 'fishes.name')
.joins(:fishes)
.where(fishes: {name: "Nemo"})
.order('fishes.bday DESC')
这目前按预期工作,因为我输入了原始 SQL 代码。但是,因为我被告知使用原始 SQL 是一种不好的做法并且会让您容易受到漏洞的影响,所以我想使用正确的 ActiveRecord 语法重构 select 和订单行。
我知道在 .where
中,您可以使用 table_name: {column_name: "value"}
语法从连接的 table 中查找值。而且我知道,如果我想按水族馆 table 中的列排序,我可以这样做:.order(col_name: :desc)
,因为水族馆是以 table 开头的。但是当我尝试像这样将它添加到 .order
时,这似乎不起作用:.order(fishes: {bday: :desc})
我也不确定如何从原始 SQL 转换 .select
中的 'fishes.name'
,因为它也来自连接 table.
您的解决方案没有任何风险。即使您正在为 ActiveRecord 使用一些字符串参数 - 也没有地方可以在那里放置 SQL 注入。
只需将 'fishes.name'
更改为 'fishes.name AS fish_name'
即可在结果中保留两个名称。
但是,如果您更喜欢 SQL 无字符串解决方案(就像我一样),您可以使用 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)
这是我想要做的:
Aquarium
.select(:id, :name, :yr_built, 'fishes.name')
.joins(:fishes)
.where(fishes: {name: "Nemo"})
.order('fishes.bday DESC')
这目前按预期工作,因为我输入了原始 SQL 代码。但是,因为我被告知使用原始 SQL 是一种不好的做法并且会让您容易受到漏洞的影响,所以我想使用正确的 ActiveRecord 语法重构 select 和订单行。
我知道在 .where
中,您可以使用 table_name: {column_name: "value"}
语法从连接的 table 中查找值。而且我知道,如果我想按水族馆 table 中的列排序,我可以这样做:.order(col_name: :desc)
,因为水族馆是以 table 开头的。但是当我尝试像这样将它添加到 .order
时,这似乎不起作用:.order(fishes: {bday: :desc})
我也不确定如何从原始 SQL 转换 .select
中的 'fishes.name'
,因为它也来自连接 table.
您的解决方案没有任何风险。即使您正在为 ActiveRecord 使用一些字符串参数 - 也没有地方可以在那里放置 SQL 注入。
只需将 'fishes.name'
更改为 'fishes.name AS fish_name'
即可在结果中保留两个名称。
但是,如果您更喜欢 SQL 无字符串解决方案(就像我一样),您可以使用 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)