[英]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
。 另外,如果您添加更多管理員類型,則它是向前兼容的。
而不是您collect
並include?
機制,您可以簡單地使用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.