Ruby Limit / Take / First - 有时限制或忽略

时间:2013-08-18 18:20:38

标签: ruby middleman

我有以下方法:

现在有时候我希望忽略limit属性

因此,.take方法会被忽略,目前我不知道如何优雅地执行此操作。设置为nil错误代码。

任何帮助表示赞赏 - 对红宝石来说是新手。

def articlesByCategory( category, extensions = [ "md" ], limit = 3 )

    # Check category is an array
    if !category.kind_of?(Array)
        category = [ category ]
    end

    # Create Return Array
    ret = []

    # Get the resources that are
    sitemap.resources.select { |r| ( category & Array( r.data.category ) ).present? }.take( limit ).each do |a|

        ret << a

    end

    # Return
    ret

end

3 个答案:

答案 0 :(得分:1)

首先,您的代码可以进行重大重构,以执行与现在相同的操作。没有必要each来构建数组的精确副本,我们可以将Kernel#Array应用于category,方法与r.data.category相同。最后,any?读取的内容比present?更好(IMO),特别是因为该值不能是nil(只有在nilfalse是有效的类别)。

def articles_by_category category, limit = 3
  category = Array(category)
  sitemap.resources.select do |resource|
    (Array(resource.data.category) & category).any?
  end.take(limit)
end

我们可以轻松地将take拉出来以获得您想要的条件:

def articles_by_category category, limit = 3
  category = Array(category)
  articles = sitemap.resources.select do |resource|
    (Array(resource.data.category) & category).any?
  end
  limit ? articles.take(limit) : articles
end

然而,在方法中完全摆脱限制并将其强加于外部可能是有意义的。这更具功能性并且使你的方法不会做很多事情(限制与按类别获取文章有什么关系?(这种方法甚至没有按类别获取文章,它获得了任何资源(可能是文章......) )对于给定的类别))。

def articles_by_category category
  category = Array(category)
  sitemap.resources.select do |resource|
    (Array(resource.data.category) & category).any?
  end
end

articles_by_category('My Category').take(3)

请注意,如果category永远不是一个数组(看起来很可能是它的单数名称),那么你可以进一步简化你的方法:

def articles_by_category category
  sitemap.resources.select do |resource|
    resource.data.category == category
  end
end

(当然,如果需要,还可以添加limit功能。)

答案 1 :(得分:0)

你可以简单地做

category ||= []

答案 2 :(得分:0)

最后是这样吗

def articlesByCategory( category, extensions = [ "md" ], limit = 3 )

    # Check category is an array
    if !category.kind_of?(Array)
        category = [ category ]
    end

    # Create Return Array
    ret = []

    # Get Resources
    resources = sitemap.resources.select { |r| ( category & Array( r.data.category ) ).present? }

    # Check limit is set
    if !limit.nil?
        resources = resources.take( limit )
    end

    # Get the resources that are
    resources.each do |a|

        ret << a

    end

    # Return
    ret

end