2006年11月26日,星期日

Rails 1.2 RC1:ActiveRecord 新特性

由 josh 发布

以下是 ActiveRecord 在 Rails 1.2 版本中自 1.1 版本发布以来所做的一些虽小但值得关注的改进。(由 Josh Susser 整理)。

查找

为 #find 添加了简单的哈希条件,它会将哈希转换为基于相等/AND 的条件字符串。示例:

Person.find(:all, :conditions => { :last_name => "Catlin", :status => 1 })

…相当于

Person.find(:all, :conditions => [ "last_name = ? and status = ?", "Catlin", 1 ])

这使得从表单或其他外部来源传递选项更加容易。

添加了 find_or_initialize_by_X,它的工作方式类似于 find_or_create_by_X,但不会保存新实例化的记录。

记录和记录数组将作为带引号的 ID 绑定。

Foo.find(:all, :conditions => ['bar_id IN (?)', bars])
Foo.find(:first, :conditions => ['bar_id = ?', bar])

关联

允许在 has_many :through 关联中使用 :uniq => true。这相当于在 SQL 中执行 SELECT DISTINCT,但它是在 Ruby 代码中完成的。

使用 «, push, 和 concat 添加记录到 has_many :through,通过创建关联模型记录。如果基础记录或关联记录是新记录,则会引发异常,因为创建关联需要两个 ID。#build 会引发错误,因为无法关联未保存的记录。#create! 接受一个属性哈希,并在事务中创建关联记录及其关联模型记录。

例如

# before:
post.taggings.create!(:tag => Tag.find_by_name('finally')
# after:
post.tags << Tag.find_by_name('finally')

以及

# before:
transaction { post.taggings.create!(:tag => Tag.create!(:name => 'general')) }
# after:
post.tags.create! :name => 'general'

has_many :through 关联添加了 #delete 支持

has_one 支持 :dependent 选项::destroy, :delete, 和 :nullify。

杂项

支持行级锁定,可以使用 :lock finder 选项或 #lock! 方法。有关详细信息,请参阅 ActiveRecord::Locking::Pessimistic 文档。

# Obtain an exclusive lock on person 1 so we can safely increment visits.
Person.transaction do
  # SELECT * FROM people WHERE id=1 FOR UPDATE
  person = Person.find(1, :lock => true)
  person.visits += 1
  person.save!
end