在已经检索到的mysql结果中搜索

时间:2011-05-24 17:47:29

标签: ruby-on-rails search object

我正在尝试限制我执行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中没有看到任何内容。

注意:上面的代码可能不完美,因为我还没有运行它,只是写下了我的头脑,但希望它能让你了解我的目标。

1 个答案:

答案 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

中的所有数据