在Rails中的循环内创建Hash在两个关联模型之间

时间:2013-09-21 12:29:58

标签: ruby-on-rails ruby-on-rails-3

我的应用有两种型号学生和家长student belongs_to parent

家长有namecontact_no

属性

我想做的是基于某些条件

@h=Hash.new
@students = Student.find(:condition)
@students.each do |student| 
  @h[@student.parent.contact_no] = @student.parent.contact_no+','+@student.name
end

但哈希没有被创建。我无法理解这有什么问题。

适用于单个学生的代码不适用于循环

@h=Hash["@student.parent.contact_no" = @student.parent.contact_no]

1 个答案:

答案 0 :(得分:0)

除非在某个地方确实定义了@student实例变量,否则我们无法看到......最有可能的意思是你不打算在循环中使用@符号。所以,相反:

@students.each do |student| 
  @h[student.parent.contact_no] = student.parent.contact_no+','+student.name
end

那就是说,你可以做很多事情来清理它并加快速度。我会这样做,而不是:

@students = Student.includes(:parents).where(<condition>)  # Eager load the associated parents
@h = @students.inject({}) do |acc, student|  # Initialize the new hash and loop
  acc[student.parent.contact_no] = "#{student.parent.contact_no},#{student.name}"  # String interpolation is faster than concatenation
  acc  # Return the accumulator
end

这里,inject(有时称为reduce)将负责初始化新哈希,然后在结束时返回构建哈希。然后,因为我们使用了parents关联的急切加载,所以我们不会在循环的每次迭代中进行数据库查找。最后,字符串插值("#{}")比字符串连接("" + "")更快。