我想从rails代码中删除below循环。
list=Student.find_by_sql("select study_id from students where id in (1,2,3,4,5)")
list.each do |val|
Subject.where(:sub_id=>val).update({:sub_code=> 'SO1'})
end
我如何重写这些代码而不循环list,并直接在where条件中传递list?
我想从rails代码中删除below循环。
list=Student.find_by_sql("select study_id from students where id in (1,2,3,4,5)")
list.each do |val|
Subject.where(:sub_id=>val).update({:sub_code=> 'SO1'})
end
我如何重写这些代码而不循环list,并直接在where条件中传递list?
2条答案
按热度按时间13z8s7eq1#
假设您有不遵循Rails约定的主键,并且正确配置了
Subject
和Student
之间的关联,那么您将能够编写:值得注意的是,
update_all
只创建一个查询,直接通过SQL过滤和更新记录。但是因为update_all
只生成一个SQL查询,所以它绕过并跳过了验证和回调。当没有依赖于该属性的验证或回调时,这对于简单的单个属性更新来说可能是可以的。但是,当您希望确保验证和回调运行时,您无法避免将记录加载到内存中,并使用
update
甚至update!
,如下所示:这个版本仍然比问题中的版本好,因为它只需要一次查询就可以将所有记录加载到内存中,并且只对它们进行单独更新,而问题中的版本则是通过单独的查询将每条记录加载到内存中。
06odsfpq2#
您可以连接科目和学生表以查询需要更新的科目,如下所示: