我的应用有两种型号学生和家长student
belongs_to
parent
。
家长有name
和contact_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]
答案 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
关联的急切加载,所以我们不会在循环的每次迭代中进行数据库查找。最后,字符串插值("#{}"
)比字符串连接("" + ""
)更快。