ruby 在Rails中使用Postgres row_to_json()函数

tkclm6bt  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(140)

在Rails 4.x中,我试图弄清楚如何直接从Postgres返回JSON,所以我没有返回一堆ActiveRecord对象(或哈希),然后我需要保存在内存中并序列化为JSON。由于Postgres现在可以原生地返回JSON,因此它似乎更适合编写JSON API。
在Postgres中,对于一个名为books的表,我会写如下内容:

select row_to_json(books) from books;

通常,在Rails中,我会执行类似Book.all的操作来加载它们,但我想使用row_to_json函数。我怎样才能做到这一点,而不只是手动编写我的SQL查询?
理想情况下,我会执行类似Book.all.rows_to_json的操作来返回JSON字符串。
我不想做render json: @books,因为这将使用内置的解析器,并在AR对象上加载所有内容。

fzsnzjdm

fzsnzjdm1#

我也喜欢快速端点,享受AR语法
比如

class ApplicationRecord < ActiveRecord::Base
  scope :rows_to_json, -> {
    ActiveRecord::Base.connection.execute(
      <<~SQL.squish,
        SELECT json_agg(row_to_json(query))
        FROM (#{to_sql}) AS query
      SQL
    ).first["json_agg"] || [].to_json
  }
end

然后

> Book.all.rows_to_json
SELECT json_agg(row_to_json(query)) FROM (SELECT "books".* FROM "books") AS query
=> "[{\"id\":\"123\"}]"

控制器变成

class BooksController < ApplicationController
  def index
    render json: Book.all.rows_to_json
  end
end

如果模型的序列化器中有任何逻辑,则需要将其移植到SQL:

Book.select(%q{author as "authorName"}).all.rows_to_json

相关问题