簡體   English   中英

Ruby:將兩種相似的方法合而為一嗎?

[英]Ruby: Combine two similar methods into one?

我在Rails應用程序的Ruby對象中有兩種極其相似的方法。 我知道它們可以合並,但我不知道如何合並。 (特別要指出的是,除了return unless ,您可以找到一種更漂亮的方法來處理可能的nil, return unless不使用#try 。)

 def is_portal_admin?(resource)
    return unless resource.user && resource.user.clinic_memberships.any?
    memberships = resource.user.clinic_memberships.collect { |membership| membership.portal_admin? }
    memberships.include?(true)
  end

  def is_staff_admin?(resource)
    return unless resource.user && resource.user.clinic_memberships.any?
    memberships = resource.user.clinic_memberships.collect { |membership| membership.staff_admin? }
    memberships.include?(true)
  end

怎么樣:

def is_admin_of_type?(type, resource)
  return unless resource.user && resource.user.clinic_memberships.any? && type
  memberships = resource.user.clinic_memberships.collect { |membership| membership.send("#{type}_admin?") }
  memberships.include?(true)
end

如果有人給出了一個不存在的類型,它將拋出NoMethodError 另外,如果您添加更多管理員類型,則它是向前兼容的。

而不是您collectinclude? 機制,您可以簡單地使用any? 如果clinic_memberships總是返回一個數組(例如,它具有has_many關聯,則返回數組),您甚至不需要檢查該數組。

def has_membership?(resource, &block)
  return unless resource.user
  resource.user.clinic_memberships.any?(&block)
end

然后可以這樣稱呼

has_membership?(resource, &:portal_admin?)

相當於

has_memberhsip?(resource){|m| m.portal_admin?}
def is_admin?(resource, kind)
  if resource.user && resource.user.clinic_memberships.any?
    !!resource.user.clinic_memberships.detect { |membership| membership.send("#{kind}_admin?") }
  end
end

如果不輸入if分支,則返回nil,因此執行上述條件將產生與顯式返回相同的結果,除非...

添加第二個參數並傳遞:staff或:portal(或“ staff”或“ portal”)。 使用“發送”將在運行時評估為“ staff_admin?” 或“ portal_admin?”

使用檢測而不是收集+包含? 如果找到至少一個對象,則將返回一個對象! 雙重否定將其轉換為真/假結果。

我個人就是這樣做,因為resource.user.clinic_memberships.any? 在宏偉的計划中無濟於事:

def is_admin?(resource, kind)
  !!resource.user.clinic_memberships.detect { |membership| membership.send("#{kind}_admin?") } if resource.user
end

如果您實際上是在努力防止clinical_memberships為零,那么您確實需要條件的第二個一半,但是要刪除“ .any?”,否則將進行錯誤測試嗎? 反對零。

def is_portal_admin?(resource)
  is_admin_of_type?(resource, :portal)
end

def is_staff_admin?(resource)
  is_admin_of_type?(resource, :staff)
end

def is_admin_of_type?(resource, type)
  if (user = resource.user)
    user.clinic_memberships.any? { |ms| ms.send("#{type}_admin?") }
  end
end
  • 檢查是否有memberships是多余的。
  • 您可以添加|| false || false|| false ,所以您確定您的method? 返回一個布爾值。
  • 您可以使is_admin_of_type? 私人的。

暫無
暫無

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

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