2013-09-21 114 views
0

我的應用程序有兩個模型Student和Parent,其中student belongs_toparent在Rails中創建一個哈希在兩個關聯模型之間

家長有屬性namecontact_no

我想要做的是基於某些條件

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

但不獲取創建哈希值。我無法理解這方面的錯誤。

這對於一個學生正常工作的代碼不是在循環

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

它看起來像沒有得到您的查找返回。另外,如果您使用的是Rails 3+,則應該使用「where」而不是「find」 – cpuguy83

+0

感謝您的快速回復。發現工作正常。學生對象正被代碼的其他部分使用,沒有任何問題。我只是在創建哈希時出錯。 – user1665975

回答

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關聯的急切加載,所以我們不會在循環的每次迭代中進行數據庫查找。最後,字符串插值("#{}")比字符串連接("" + "")更快。

+0

非常感謝幫助我,併爲乾淨的方式和技巧。 – user1665975

相關問題