2010-12-09 29 views
0

我有一個重複的代碼塊,初始化一堆不同的控制器方法中的幾個變量。有沒有辦法讓我用模型方法做這個DRY,而不是在每個控制器方法中重複相同的代碼塊?Ruby on Rails:乾燥重複的代碼塊,初始化幾個變量

基本上,這是一個社交網站,它拉起了一個用戶的朋友列表,然後根據用戶擁有的存儲在友情模型中的權限構建好友的列表。這個桶的重複初始化是我試圖做DRY的。

通常我會使用模型方法,但在這種情況下,3個單獨的變量正在基於一個數據庫拉進行初始化,並且這經常被調用,我不想通過點擊數據庫3使其不必要的低效倍。在C中,我只會使用作爲變量傳入的指針。

它是這樣的:

def example_method 
    friendships = @user.friendships 
    view_permission_friends = [] 
    write_permission_friends = [] 
    message_permission_friends = [] 
    for friendship in friendships 
    if friendship.view_permission then view_permission_friends << friendship.friend_id end 
    if friendship.write_permission then write_permission_friends << friendship.friend_id end 
    if friendship.message_permission then message_permission_friends << friendship.friend_id end 
    end 
    #Do something with the 3 initialized arrays here 
end 

回答

1

我思考了一下,我覺得這代碼應該進入你的用戶模型。 (或者其他類@user在你上面的例子。)有兩個原因:

  1. 這是非常特殊的用戶,它的關係,最重要的是,他們是如何存儲和從數據庫中檢索。
  2. 您只需編寫一次代碼:在用戶模型中。

依賴於Rails內部查詢緩存的快捷方式看起來像這樣。加入到用戶模式:

def view_permission_friends 
    return friendships.select{|f| f.view_permission} 
end 

(etc.) 

你的控制器,然後簡單地做到這一點:(注 - 有優化,並通過懶惰緩存更好的靈活性這裏和參數允許更多的空間)

@viewers = @user.view_permission_friends 
(etc.) 

0

......怎麼

rv = {} 
%w(view write message).each do |type| 
    rv["#{type}_permission_friends"] = @user.friendships.select{|f|f.send(:"#{type}_permission")}.collect(&:friend_id) 
end 

這給你的鑰匙,而不是單獨的陣列哈希,但應該足夠了。

+0

我想我可能不清楚我的問題,我修改了。我試圖在每個控制器方法中重複使用整個塊,而不是優化塊本身。我可以將數組建築拆分成不同的行。雖然你是對的,但如果我要從模型方法中返回一個哈希值,這將使我能夠將數組粘貼到哈希中。那是做到這一點的最佳方式嗎? – 2010-12-09 01:08:14

0

使用Enumerable#injectEnumerable#find_allObject#instance_variable_set

def example_method 
    %w{view write message}.inject({}) do |memo, s| 
    friendships = @user.friendships.find_all{ |f| f.send("#{s}_permission") } 
    memo["#{s}_permission_friends"] = friendships 
    end.each do |key, value| 
    instance_variable_set "@#{key}", value 
    end 

    # now you have 3 arrays: 
    # @view_permission_friends, @write_permission_friends and @message_permission_friends 
end 
相關問題