重要的是永远不要使用Something.all.first
,而是使用Something.first
. 前者将表中的每条记录加载到内存中,然后取第一个,丢弃其余的。后者加载第一条记录。在大型表上,当您的 Rails 进程占用几 GB 内存时,这将导致非常严重的问题。
如果要选择多个 Number 记录,请按以下方式进行:
numbers = Number.find_all_by_id([ 0, 4 ])
numbers.each do |number|
number.something = something
number.save
end
更高级的方法是:
Number.update_all({ :something_id => something.id }, { :id => [ 0, 4 ] })
始终查看呈现的查询log/development.log
以了解 ActiveRecord 如何解释您的调用。结果可能令人惊讶,尤其是对于外行。
has_many
关系意味着 Number belongs_to
Something 。这也意味着 Number 有一个something_id
需要操作的列。您在示例中没有对 Number 记录进行任何保存,因此它们可能无法正确关联。我认为 Rails 3 比 Rails 2 处理得更好,表现更接近你的期望。
请记住始终针对重要的数据集测试您的应用程序。生成足够数量的虚假测试数据,以确保您正确处理分页,并且all
在开发周期的早期就暴露出诸如调用之类的错误。
唯一all
安全使用的情况是,如果您绝对确定列表中的项目数量是可以接受的小。用户提供的数据很少出现这种情况。如果用户可以在列表中拥有一千个项目,那么其中一个可能会。