以下列举了自 1.1 版本发布以来,Rails 1.2 版本中 ActiveRecord 中一些较小但值得注意的新增功能(由 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 定位程序选项或 #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