2008-05-04
Rails 2.1值得关注的新特性
Rails 2.1快出来了,和2.0相比它又添加了很多新特性,列举一下我认为值得关注的新特性:
1. Has Finder 功能
广受欢迎的Has Finder插件被集成到了2.1的代码中,不过换了种写法,使用named_scope:
你还可以传递参数:
和对象关联定义类似,你还可以使用扩展:
Rails2.1这个新特性可以极大地简化查询代码组合,达到更好的代码重用率,我们JavaEye的很多查询代码都可以从这个新特性上获益。
2. Dirty Objects
Rails2.1添加了类似Hibernate的检查对象是否变更机制,但是在使用上比Hibernate更加简洁,功能更加强大:
这个新特性可以用来方便地做变更日志,状态改变监测等等多种用途,和原先需要自己写扩展代码相比要方便多了。
3. Partial Updates
在Dirty Objects的基础上,只更新对象变更属性的功能也加入了进来:
如果要使用这个特性,需要设置:
partial updates会提高更新的性能,我们JavaEye的一些使用update_all操作的代码都可以改成使用partial updates了。
http://ryandaigle.com/ 是一个国外的专门发布Rails新特性介绍的博客,除了上面提到的3点以外,还有一些特性值得关注:
1. Has Finder 功能
广受欢迎的Has Finder插件被集成到了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的很多查询代码都可以从这个新特性上获益。
2. Dirty Objects
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"]
这个新特性可以用来方便地做变更日志,状态改变监测等等多种用途,和原先需要自己写扩展代码相比要方便多了。
3. Partial Updates
在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了。
http://ryandaigle.com/ 是一个国外的专门发布Rails新特性介绍的博客,除了上面提到的3点以外,还有一些特性值得关注:
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 27242 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
M_100_4350
共 30 张
共 30 张
最近加入圈子
最新评论
-
Java程序员应该学习Ruby
[quote="baichinie"]public interface List ...
-- by unique.wu -
Java程序员应该学习Ruby
看了这个帖子,我终于找到了在本论坛可以多得分的秘密途径,也就是捷径,那就是多写R ...
-- by ltian -
Java程序员应该学习Ruby
以前我主要用.net, 现在改用python, 无论如何不想换回去了. 不过, ...
-- by 白发红颜 -
Java程序员应该学习Ruby
geszJava 写道ruby没啥吸引力,还是groovy好,不容易犯错。rub ...
-- by liusong1111 -
Java程序员应该学习Ruby
ruby没啥吸引力,还是groovy好,不容易犯错。ruby陷阱太多了,如果不是 ...
-- by geszJava






评论排行榜