Я пытаюсь ограничить количество раз, когда я выполняю запрос 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 о поиске.
Примечание: приведенный выше код может быть не идеальным, потому что я еще не запускаю его, просто написал это на макушке, но, надеюсь, это даст вам представление о том, к чему я иду.