3

RailsアプリのRubyオブジェクトには2つの非常によく似たメソッドがあります。私はそれらを組み合わせることができることを知っています、私はただ方法がわかりません。return unless(使用せずに、可能性のあるnilを処理するためのより美しい方法を見つけることができる場合は、追加のポイント#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
4

4 に答える 4

3

どうですか:

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ます。また、さらに管理タイプを追加すると、前方互換性があります。

于 2013-03-21T21:51:31.520 に答える
2

collectandメカニズムの代わりに、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?}
于 2013-03-21T21:59:12.627 に答える
0
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 が返されるため、上記のように条件を実行すると、明示的な return と同じ結果が得られます...

2 番目のパラメーターを追加して、:staff または :portal (または "staff" または "portal") を渡します。「send」を使用すると、実行時に「staff_admin?」に評価されます。または「portal_admin?」

収集+インクルードの代わりに検出を使用しますか? 少なくとも 1 つ見つかった場合、オブジェクトを返します。二重否定して真/偽の結果にします。

resource.user.clinic_memberships.any? 物事の壮大な計画では議論の余地があります:

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

実際に Clinic_memberships が nil になるのを防ごうとしている場合は、条件文の後半が必要ですが、".any?" を削除してください。そうしないと、 any? のテストでエラーが発生します。対ゼロ。

于 2013-03-21T22:03:16.817 に答える
0
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ようにすることができます。method?
  • is_admin_of_type?プライベートにすることができます。
于 2013-03-21T22:13:18.930 に答える