我有以下方法:
现在有时候我希望忽略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
答案 0 :(得分:1)
首先,您的代码可以进行重大重构,以执行与现在相同的操作。没有必要each
来构建数组的精确副本,我们可以将Kernel#Array
应用于category
,方法与r.data.category
相同。最后,any?
读取的内容比present?
更好(IMO),特别是因为该值不能是nil
(只有在nil
或false
是有效的类别)。
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