Как правильно выбрать столбцы для возврата в сиквел после нескольких JOIN? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть запрос с несколькими JOIN.

В данный момент я получаю результат со всеми столбцами из всех таблиц.И некоторые из столбцов имеют одинаковые имена, потому что так в моей базе данных.Как я могу выбрать столбцы для возврата и настроить их имена в наборе результатов ?

Я пытался:

    result = MyModel1.join(:table2, id: :table2_id)


    if condition1
      result = result.join(.....).where(.....)
    end


    if condition2
      result = result.join(.....).where(.....)
    end

    # and so on....


    result

И если я делаю это:

  result.select([Sequel[:model1][:column1], Sequel[:model2][:column2]])

Я получаю это после преобразования в json:

  [{"row":["column1_value1","column1_value11"]},{"row":["column1_value2","column1_value22"]},{"row":["column1_value3","column1_value33"]}]

Что такое "строка"?Как от этого избавиться?Как добавить имена столбцов и изменить структуру ответа json, чтобы он выглядел правильно?

Я хочу что-то вроде этого:

  [
    {"column1": "column1_value1", "column2" "column1_value11"},
    {"column1": "column1_value2", "column2" "column1_value22"},
    {"column1": "column1_value3", "column2" "column1_value33"}
  ]

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Вы можете использовать метод as :

Sequel.select(
  Sequel[:table1][:column1].as(:alias1),
  Sequel[:table2][:column2].as(:alias2)
)
0 голосов
/ 11 июня 2018

Если результат относительно невелик, вы можете иметь дело с выводом.

outcome =
  [{"row":["column1_value1","column1_value11"]},
   {"row":["column1_value2","column1_value22"]},
   {"row":["column1_value3","column1_value33"]}]

outcome.
  map(&:values).                 # get rid of "row"
  map(&:flatten).                # get rid of nesting
  map(&%i|c1 c2|.method(:zip)).  # attach titles
  map(&:to_h)                    # hashify
#⇒ [{:c1=>"column1_value1", :c2=>"column1_value11"},
#   {:c1=>"column1_value2", :c2=>"column1_value22"},
#   {:c1=>"column1_value3", :c2=>"column1_value33"}]

Последнее может быть сделано за один цикл, я показал цепные карты, чтобы уточнить необходимые шаги.

...