Создать хеш внутри цикла с запросом - PullRequest
1 голос
/ 29 октября 2019

Я хочу создать хеш из данных, которые вытащены из БД. Хеш должен выглядеть следующим образом:

hash { id: process.id,
       name: company_name }

Чтобы получить название компании, мне нужно выполнить какой-то запрос, который возвращает массив строк с названиями компаний:

Process.all.map do |process|
  process.inquiry_field_responses
         .joins(:inquiry_field)
         .where(inquiry_fields: { name: 'company_name' })
         .first&.value
end

Чтобы создать этот хэш, я думал, что вседолжен сделать что-то вроде:

fetcher = []

Process.all.map do |process|
  company_name = process.inquiry_field_responses
                        .joins(:inquiry_field)
                        .where(inquiry_fields: { name: 'company_name' })
                        .first&.value
  if company_name != nil
    fetcher << {
      id: process.id,
      name: company_name,
    }
  end
end

Но в результате я получу:

    2.6.0 :318 > fetcher
 => [{:id=>1, :name=>nil}, {:id=>2, :name=>nil}, {:id=>3, :name=>nil}, 
{:id=>4, :name=>nil}, {:id=>5, :name=>nil}, {:id=>6, :name=>nil}, {:id=>7, 
:name=>nil}, {:id=>8, :name=>nil}, {:id=>9, :name=>nil}, {:id=>10, 
:name=>nil}, {:id=>11, :name=>nil}, {:id=>12, :name=>nil}, {:id=>13, 
:name=>nil}, {:id=>14, :name=>nil}, {:id=>15, :name=>nil}, {:id=>16, 
:name=>nil}, {:id=>17, :name=>nil}, {:id=>18, :name=>nil}, {:id=>19, 
:name=>nil}, {:id=>20, :name=>nil}, {:id=>21, :name=>nil}, {:id=>22, 
:name=>nil}, {:id=>23, :name=>nil}, {:id=>24, :name=>nil}, {:id=>25, 
:name=>nil}, {:id=>26, :name=>nil}, {:id=>27, :name=>nil}, {:id=>28, 
:name=>nil}, {:id=>29, :name=>nil}, {:id=>30, :name=>nil}, {:id=>31, 
:name=>nil}, {:id=>32, :name=>nil}, {:id=>33, :name=>nil}, {:id=>34, 
:name=>nil}, {:id=>35, :name=>nil}, {:id=>36, :name=>nil}, {:id=>37, 
:name=>nil}, {:id=>38, :name=>nil}, {:id=>39, :name=>nil}, {:id=>40, 
:name=>nil}, {:id=>41, :name=>nil}, {:id=>42, :name=>nil}, {:id=>43, 
:name=>nil}, {:id=>44, :name=>nil}, {:id=>45, :name=>nil}, {:id=>46, 
:name=>nil}, {:id=>47, :name=>nil}, {:id=>48, :name=>nil}, {:id=>49, 
:name=>nil}, {:id=>50, :name=>nil}, {:id=>51, :name=>"231421AAAAA firma"}, 
{:id=>52, :name=>"tregfsd"}, {:id=>53, :name=>"aaaaa"}, {:id=>54, 
:name=>"zzzzzz"}, {:id=>55, :name=>"bbbbb"},

Вместо:

2.6.0 :318 > fetcher
{:id=>52, :name=>"tregfsd"}, {:id=>53, :name=>"aaaaa"}, {:id=>54, 
:name=>"zzzzzz"}, {:id=>55, :name=>"bbbbb"},

1 Ответ

2 голосов
/ 29 октября 2019

Этот тип итерации необходимо оптимизировать, чтобы избежать проблемы запроса N + 1 для больших наборов данных. Но это, вероятно, будет работать для вас сейчас.

Process.all.map do |process|
  company_name = process.inquiry_field_responses
                        .joins(:inquiry_field)
                        .where(inquiry_fields: { name: 'company_name' })
                        .first&.value
  if company_name.present?
    {
      id: process.id,
      name: company_name,
    }
  end
end.compact
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...