这是我在控制器中的查询(索引操作):
@tags = ActiveRecord::Base.connection.execute(
<<~SQL
SELECT t.id, t.name, t.member_tags_count, (
SELECT
json_agg(mt.member_id) as member_ids
FROM member_tags mt
WHERE mt.tag_id = t.id)
FROM tags t
ORDER BY LOWER(t.name)
SQL
)
render json: @tags
它在1.9ms内运行并返回以下内容:
#<PG::Result:0x000000010e368580 status=PGRES_TUPLES_OK ntuples=31 nfields=4 cmd_tuples=31>
(ruby) @tags.first
{"id"=>1, "name"=>"Avengers", "member_tags_count"=>3, "member_ids"=>"[1, 3, 7]"}
问题:member_ids
应该是API的整数数组,但它当前作为字符串返回。
**问题:**有没有办法将member_ids
作为数组返回,而不将@tags
结果循环到JSON.parse
?
下面是我当前的实现,这样我就可以继续了,但是它看起来很混乱,运行时间要长4倍(5.7毫秒)。
@tags = Tag
.joins(:member_tags)
.order('LOWER(name)')
.group(:id)
.pluck(
:id,
:name,
:member_tags_count,
'array_agg(member_tags.member_id)'
).map do |column| {
id: column[0],
name: column[1],
member_tags_count: column[2],
member_ids: column[3]
}
end
render json: @tags
以上返回:
(ruby) @tags.first
{:id=>1, :name=>"Avengers", :member_tags_count=>3, :member_ids=>[1, 3, 7]}
2条答案
按热度按时间h22fl7wq1#
您需要
json_agg
,而不是Postgres驱动程序知道如何处理的array_agg
。使用
.pluck
代替.select_all
也没有什么意义,因为它迫使您不得不经历处理数组的混乱。whlutmcx2#
您可以使用
as_json
方法,并将pluck
更改为带有id数组别名的select