我正在尝试限制我执行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查询有任何连接。因此,我似乎无法说'这是否与db预期的数据类型相匹配。
我可以通过同样的过程重新开始,让我达到那个级别,然后再做这样的查询
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结果中搜索名称,然后获取相关的字段?
我尝试搜索“搜索rails对象”,但不断获取有关构建搜索的结果,而不是在现有对象中搜索。
我知道我可以做array.search,但是在关于搜索的对象api中没有看到任何内容。
注意:上面的代码可能不完美,因为我还没有运行它,只是写下了我的头脑,但希望它能让你了解我的目标。
答案 0 :(得分:1)
填充col_indexes数组时,不是存储单个值,而是可以存储包含index和数据类型的哈希值。
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