- class Project < ActiveRecord::Base
- has_many :tasks
-
- def self.all_names
- find(:all).collect(&:name)
- end
- end
看懂上面的方法没有?
为什么可以这么用呢: find(:all).collect(&:name)?
&的作用是什么呢?
我们习惯的用法是:
find(:all).collect{|p| p.name}, 后面的collect方法将每一个对象执行.name方法,然后返回到一个数组中。
而&:name 的作用就是将name 方法转化成proc, 相当于 :name.to_proc
对,&:name 就是一个shortcut。
例如,你还可以这样使用:
projects.collect(&:name).collect(&:upcase)
这种技术当如不是限于collect方法自己,很多方法都可以:
projects.all?(&:valid?)
projects.any?(&:valid?)
projects.each(&:save!)
你可能已经发现了,将方法转化成proc之后,就不再使用{}了,而是改成像参数传递一样,使用:
( ) 了, 这可能就是引入这种做法的目的把。
阅读(391) | 评论(0) | 转发(0) |