有一个Model Record,想在Records表中查找所有包含关键字keyword的记录,先每个字段模糊匹配,然后将每次查询的结果叠加起来,这样问题就来了,里面会有重复的记录。想到以前有通过循环的方法删除数组中重复的元素,也就用这样的方法进行删除,但代码繁琐还容易出错。在查询rails的数组的操作方法时,发现了这样一个操作 :
| 并集操作,也就是把不同的组合在一起
这样在查询结果叠加的时候就能避免重复了O(∩_∩)O Rails的数组操作还真是方便啊
if params[:keyword]=="" @records=Record.all else @records = Array.new (1..@fields.count).each do |i| @records_1 = Array.new @records_1 = Record.find(:all, :conditions=>["field#{i} LIKE ?", "%#{params[:keyword]}%"]) @records = @records | @records_1 end end
下面是Array常用的一些操作& 取两数组相同* 数组相乘+ 数组相加- [1,2,3]-[1,2,4] = [3]<< 追加<=> 比较每个元素 小于-1等于0大于1(每个元素比较)to_ary 转换成数组== 相等[] 下标引用。a=[1,2,3,4].a[1]下标为1的元素,a[1,3]从下标为1顺序取三个,a[1..3]1-3的元素.特殊 a[4]=>nil, a[4..6]=>[], a[5..7] => nil[]= 赋值| 并集操作,也就是把不同的组合在一起assoc('a') 匹配子数组第一个元素,匹配到返回子数组,否则nil不匹配字符串at 返回下标处元素,比[]快,不支持range(范围,例:1..5)参数clear 清楚数组collect收集 对每个元素调用block。!号模式替换原来的,此拷贝原来数组compact压缩 去掉nil,有!号模式concat 追加后面的数组delete 删除指定元素,返回删除元素,数组没有指定的元素返回nil,有block返回block[1,2].delete(1) {"sorry"}delete_at 删除指定下标的delete_if 有条件删除,调用block,返回剩余元素each 循环数组each_index 循环下标empty? 判断是否为空eql? 比较fetch取来 用法a=[1,2,3] a.fetck(1)=>2,a.fetch(1,"b")=>1,a.fetch(5,"b")=>b,a.fetch(5){|i|i*i}=>25fill填充,装满 参数型式(obj),(obj,range(范围)),{|i| i代表下标},(range){|i|操作}flatten 扁平数组,!号模式include? 包含 true or falseindex 返回下标或nilinsert 插入只能指定下标,不能指定下标范围join 合并,后面可以加参数('-')last 返回最后一个,也可以加返回最后几个length 数组长度map 和collect同义nitems 返回非nil的长度pop 删除数组最后一个元素并返回,nil也返回nilpush 将指定参数加到数组中,可以任何对象rassoc 不怎么明白有何用reject 等同于delete_ifreplace取代 替换元素reverse相反 反序有!模式reverse_each 逆序遍历数组rindex 删除数组的最后一个指定的对象,没有返回nilshift 删除第一个slice 于[]同义slice! 删除给定的索引,参数是rangesort 排序,有!模式to_a,to_ary 转换成数组tracspose 二维数组更换行和列uniq 删除重复元素,有!模式unshift 添加对象到数组首部values_at 参数下标,返回数组。可以是范围