2011-07-11 71 views
2

我有一個用戶對象說我暴露通過簡單的調用:遍歷2模型對象軌道

@users = User.all 

我也有一些更昂貴的疑問我在做,我正在使用自定義的SQL來生成結果。

@comment_counts = User.received_comment_counts 

這個調用和其他喜歡它的人會在我的列表中按照id排序的每個用戶返回一個元素的對象。

在我看來,我想同時遍歷用戶和comment_counts對象。例如:

for user, comment_count in @users, @comment_counts do 
end 

我想不出如何做到這一點。我也似乎無法弄清楚如何從@comment_counts結果中獲取單個記錄,而無需通過@ comment_counts.each運行它。

是不是有一些方法爲這些lits對象中的每一個構建迭代器,轉儲他們進入一個while循環並在循環的每個循環中單獨執行迭代器?另外,如果你可以回答這個問題,我可以去哪裏瞭解如何在列表中逐步列表。

回答

4

像這樣的東西應該爲你工作:

@users.zip(@comment_counts).each do |user, comments_count| 
    # Do something 
end 

我從來沒有在Ruby中遇到迭代器的手動操作,不是說不能做。像這樣的代碼可能會很混亂,所以我可能會喜歡更優雅的解決方案。

+0

@comment_counts是一個Mysql2 ::結果,所以我得到的錯誤 - 無法將Mysql2 :: Result轉換爲數組。這真的很有趣。 – walta

+0

啊,你需要首先從'@ comment_counts'的查詢結果中獲取數據。如果你不熟悉的話,這裏有一個例子:http://rubydoc.info/gems/mysql2/0.3.6/frames –

+0

這樣做的技巧 - 和rubydoc.info引用是有用的thankya! – walta

3

假設陣列具有相等的值:

在你的控制器:

@users = User.all 
@comments = Comment.all 

在您的視圖。

<% @users.each_with_index do |user, i |%> 
    <% debug user %> 
    <% debug @comments[i] %> 
<% end %> 

然後,你可以檢查是否存在價值觀上@comments,如果你不知道,如果陣列具有相同數量的對象。

0

這並不明顯,因爲您的數據需要一點重構。 comment_count顯然屬於User的實例,應該反映這種情況,以便只需要在一個集合(的User s)上進行循環。我可以想出兩種可能的方法來實現這一點:

  1. Eager loading只適用於相關型號,而不是這裏的情況。比如說,你的每個用戶都有comments,所以編寫User.includes(:comments).all會返回所有用戶的評論,只做2個查詢來獲取數據。

  2. 要統計每個用戶的評論,您可以使用counter_cache (clickable)。然後,您將在users表中有一個字段用於緩存用戶有多少評論。再次,僅適用於相關聯的Comment