Rails 2.1值得关注的新特性

[url=http://www.iteye.com/news/2118]Rails 2.1快出来了[/url],和2.0相比它又添加了很多新特性,列举一下我认为值得关注的新特性:

[size=medium]1. Has Finder 功能[/size]

广受欢迎的[url=http://pivots.pivotallabs.com/users/nick/blog/articles/284-hasfinder-it-s-now-easier-than-ever-to-create-complex-re-usable-sql-queries]Has Finder[/url]插件被集成到了2.1的代码中,不过换了种写法,使用named_scope:

class User < ActiveRecord::Base
named_scope :active, :conditions => {:active => true}
named_scope :inactive, :conditions => {:active => false}
named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } }
end

# 用法
User.active # same as User.find(:all, :conditions => {:active => true})
User.inactive # same as User.find(:all, :conditions => {:active => false})
User.recent # same as User.find(:all, :conditions => ['created_at > ?', 1.week.ago])

# 还可以把他们组合起来组合用
User.active.recent


你还可以传递参数:

class User < ActiveRecord::Base
named_scope :registered, lambda { |time_ago| { :conditions => ['created_at > ?', time_ago] }
end

User.registered 7.days.ago # same as User.find(:all, :conditions => ['created_at > ?', 7.days.ago])


和对象关联定义类似,你还可以使用扩展:

class User < ActiveRecord::Base
named_scope :inactive, :conditions => {:active => false} do
def activate
each { |i| i.update_attribute(:active, true) }
end
end
end

# Re-activate all inactive users
User.inactive.activate


Rails2.1这个新特性可以极大地简化查询代码组合,达到更好的代码重用率,我们JavaEye的很多查询代码都可以从这个新特性上获益。


[size=medium]2. Dirty Objects[/size]

Rails2.1添加了类似Hibernate的检查对象是否变更机制,但是在使用上比Hibernate更加简洁,功能更加强大:

article = Article.find(:first)
article.changed? #=> false

# 它还可以单独检查某个属性是否变更过
# 使用 attr_name_changed? 方法
article.title #=> "Title"
article.title = "New Title"
article.title_changed? #=> true

# 使用 attr_name_was 方法获取变更前的值
article.title_was #=> "Title"

# 使用 attr_name_change 方法同时获取新旧2个值
article.title_change #=> ["Title", "New Title"]


这个新特性可以用来方便地做变更日志,状态改变监测等等多种用途,和原先需要自己写扩展代码相比要方便多了。


[size=medium]3. Partial Updates[/size]

在Dirty Objects的基础上,只更新对象变更属性的功能也加入了进来:

article = Article.find(:first)
article.title #=> "Title"
article.subject #=> "Edge Rails"

# 只更新一个属性
article.title = "New Title"

# 只有更新过的属性被执行了update操作
article.save
#=> "UPDATE articles SET title = 'New Title' WHERE id = 1"


如果要使用这个特性,需要设置:

ActiveRecord::Base.partial_updates = true

partial updates会提高更新的性能,我们JavaEye的一些使用update_all操作的代码都可以改成使用partial updates了。

[url]http://ryandaigle.com/[/url] 是一个国外的专门发布Rails新特性介绍的博客,除了上面提到的3点以外,还有一些特性值得关注:
[list]
[*][url=http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-gem-dependencies]Gem Dependencies[/url]
[*][url=http://ryandaigle.com/articles/2008/4/2/what-s-new-in-edge-rails-utc-based-migration-versioning]UTC-based Migration Versioning[/url]
[*][url=http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-one-through]Has One :through[/url]
[*][url=http://ryandaigle.com/articles/2008/1/25/what-s-new-in-edge-rails-easier-timezones]Easier Timezones[/url]
[/list]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值