浏览 2544 次
锁定老帖子 主题:Rails2.2新方法试用
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (8)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-23
Rails2.2的ActiveSupport新增加了几个方法,非常有意思。在此列举其中的两个:StringInquirer和many?进行试用。
一、StringInquirer
user = User.find(params[:id]) user.status # => "active" user.status == "active" # => true user.status == "inactive" # => false
现在我们有了更好的方法:
class User def status ActiveSupport::StringInquirer.new("#{self.status}") end end user = User.find(params[:id]) user.status # => "active" user.status.active? # => true user.status.inactive? # => false user.status.xxx? # => false
二、many?
Enumerable模块里添加了一个many?方法。它和它的名字一样,它可以告诉你collection是否包括超过一个对象。
[].many? # => false [ 1 ].many? # => false [ 1, 2 ].many? # => true
除例子里的格式外,这个方法还可以接受一个block。
x = %w{ a b c b c } # => ["a", "b", "c", "b", "c"] x.many? # => true x.many? { |y| y == 'a' } # => false x.many? { |y| y == 'b' } # => true people.many? { |p| p.age > 26 }
只有block里面的元素数量超过一个时才会返回true, 如果没有block的话,当collection包含超过一个对象时才返回true。
def how_many(item) return select{|y| y == item}.size end x = %w{ a b c b c } x.how_many("a") # => 1 x.how_many("b") # => 2 x.how_many("c") # => 2
具体如何将这个方法加入模块中,可以参考http://www.iteye.com/topic/521123
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-26
最后修改:2009-11-26
如果这段:
def status ActiveSupport::StringInquirer.new("#{self.status}") end 能够变成: string_inquirer :status 就好了。 |
|
返回顶楼 | |
发表时间:2009-11-27
最后修改:2009-11-27
楼上的,可以这样:
module ActiveRecord class Base def self.string_inquirer(prop) define_method prop.to_s do ActiveSupport::StringInquirer.new("#{self.send(prop.to_s)}") end end end end 当你想用这个特性的时候,就可以: class YourClass < ActiveRecord::Base string_inquirer :ooxx end |
|
返回顶楼 | |
发表时间:2009-11-29
多谢楼上。
|
|
返回顶楼 | |