我试图限制我执行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中没有看到任何内容 .
注意:上面的代码可能不完美,因为我还没有运行它,只是写下了我的头脑,但希望它能让你了解我的目标 .