0

我有一个这样的 if 语句

if can?(:read, Category) || can?(:read, Category2)

如果用户可以阅读 Category 或 Category2,则会显示一个链接。

但是如果我有 10 个类别呢?必须有更短的方法而不是列出它们。我需要一点帮助。

4

3 回答 3

2

我认为一种更快的方法(如果你已经有一个类别列表)是使用detect它,因为它是一个 OR 并且只需要一个条件为真

categories.detect { |cat| can? :read, cat }

于 2013-02-01T13:56:33.680 回答
1

jvnill 的方式还可以,但我认为这应该更快更清晰,因为它只返回一个布尔值:

[Category, Category2, ...].any?{|cat| can?(:read, cat)}
于 2013-02-01T22:29:39.047 回答
1

假设您有一些对象列表:

categories = [Category1, Category2, Category3]

您可以使用 获得结果inject,如下所示:

categories.inject(false) { |p, cat| p || can?(:read, cat) }

这字面意思是:

(((false || can(:read, Category1)) || can(:read, Category2)) || can(:read, Category3))

这当然相当于:

can?(:read, Category1) || can?(:read, Category2) || can?(:read, Category3)
于 2013-02-01T13:39:46.777 回答