如何在 Rails 5.2 上的 Ruby 中使用原始 Postgres SQL 查询结果?

How to use raw Postgres SQL query result in Ruby on Rails 5.2?

我的应用程序将一个字段的多个翻译作为表单中的嵌套字段进行管理。 最初,我使用

f.fields_for fields, translations do |locution| 初始化嵌套字段(效果很好)。

现在我需要执行更复杂的查询来获取翻译列表,并允许用户为每种可用语言创建新的翻译。所以我将代码修改为:

  <% raw_SQL = "select #{document_id} as document_id, '#{document_type}' as document_type, '#{field_name}' as field_name, property as language,
  case when property = language then existing_translations.id else null end as id,
  case when property = language then existing_translations.translation else null end as translation
  from
  (select * from dqm_app.translations where document_id = #{document_id} and field_name = '#{field_name}' and document_type = '#{document_type}') as existing_translations
  right outer join (select property
  from dqm_app.parameters inner join dqm_app.parameters_lists on parameters.parameters_list_id = parameters_lists.id
  where parameters_lists.CODE = 'LIST_OF_LANGUAGES') as langues on property = language" %>
  <% f.fields_for fields, ActiveRecord::Base.connection.exec_query(raw_SQL).to_a do |locution| %>

仅存在法语翻译,由于要创建的嵌套字段,用户可以添加其他翻译:

查询returns 预期结果,但以散列数组而不是 ActiveRecord 集合的形式。如何使此结果可用于 fields_for 方法?

非常感谢您的帮助!

您可以使用具有这些属性的模型并自己投射结果。

records = ActiveRecord::Base.connection.exec_query(raw_sql).to_a
records.map { |attrs| YourModel.new(attrs) }

这可行,因为 Rails 允许您通过像

这样的散列来初始化模型

YourModel.new({ id: 1 })

Map 将遍历数组中的每个元素并分别对其进行初始化。