簡體   English   中英

Ruby on Rails:干燥重復的代碼塊以初始化一些變量

[英]Ruby on Rails: DRYing a repeated code block that initializes a few variables

我有一個重復的代碼塊,該代碼塊初始化了一堆不同的控制器方法中的一些變量。 有沒有一種方法可以使我使用模型方法進行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

我考慮了一下,我認為這段代碼應該進入您的用戶模型。 (或上面的示例中的@user類。)兩個原因:

  1. 它非常特定於用戶,其關系,最重要的是,它們如何存儲在數據庫中以及如何從數據庫中檢索出來。
  2. 您只需要編寫一次代碼:在用戶模型中。

依賴Rails內部查詢緩存的快速簡便的方法如下所示。 添加到用戶模型中:

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

(etc.)

然后,您的控制器只需執行以下操作:

@viewers = @user.view_permission_friends
(etc.)

(請注意-通過惰性緩存和參數化權限,這里有更多的優化空間和更好的靈活性。)

怎么樣...

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

這為您提供了一個帶有鍵而不是單個數組的散列,但足夠了。

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM