поиск в уже найденном MySQL-результате - PullRequest
0 голосов
/ 24 мая 2011

Я пытаюсь ограничить количество раз, когда я выполняю запрос mysql, так как это может закончиться запросом 2k + просто для достижения довольно маленького результата.

Я просматриваю файл CSV,и мне нужно проверить, что формат содержимого в csv соответствует формату, который ожидает db, и иногда я пытаюсь выполнить некоторую базовую очистку (например, у меня есть одно поле, которое является строкой, но иногда находится вCSV, как JB2003-343, и мне нужно вырезать -343).

Первое, что я делаю, это получаю из базы данных список полей по имени, которые мне нужно получить из CSV, затем я получаю индекс этих столбцов в CSV, затем я прохожу каждую строку вCSV и получить каждый из проиндексированных столбцов

get_fields = BaseField.find_by_group(:all, :conditions=>['group IN (?)',params[:group_ids]])

csv = CSV.read(csv.path)
first_line=csv.first
first_line.split(',')
csv.each_with_index do |row|
    if row==0
     col_indexes=[]
     csv_data=[]
     get_fields.each do |col|
        col_indexes << row.index(col.name)
     end
    else
      csv_row=[]
      col_indexes.each do |col|
            #possibly check the value here against another mysql query but that's ugly
        csv_row << row[col]
      end
      csv_data << csv_row
    end

end

Проблема заключается в том, что когда я добавляю содержимое csv_data для вывода, у меня больше нет связи с исходным запросом get_fields.Поэтому я не могу сказать, «соответствует ли это типу данных, ожидаемых от БД».

Я мог бы вернуться назад через тот же процесс, который опустил меня до этого уровня, и сделать другойзапрос подобен этому

get_cleanup = BaseField.find_by_csv_col_name(first_line[col])
  if get_cleanup.format==row[col].is_a
     csv_row << row[col]
  else 
     # do some data clean-up
  end

, но, как я уже говорил, это может означать, что get_cleanup запускается более 2000 раз.

Вместо того, чтобы сделать это, есть ли способ найти в исходном результате get_fields имя, а затем получить связанное поле?

Я попытался найти 'search rails object', нопродолжал получать результаты о построении поиска, а не о поиске в уже существующем объекте.

Я знаю, что могу сделать array.search, но ничего не вижу в объекте API о поиске.

Примечание: приведенный выше код может быть не идеальным, потому что я еще не запускаю его, просто написал это на макушке, но, надеюсь, это даст вам представление о том, к чему я иду.

1 Ответ

1 голос
/ 24 мая 2011

Когда вы заполняете свой массив col_indexes, а не сохраняете одно значение, вы можете сохранить хеш, который включает индекс и тип данных.

get_fields.each do |col|
  col_info = {:row_index = row.index(col.name), :name=>col.name :format=>col.format}
  col_indexes << col_info 
end

Вы можете получить доступ ко всем своим данным в for loop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...