首先,您的代码可以被显着重构以执行与现在相同的操作。无需each
构建数组的精确副本,我们可以Kernel#Array
按照category
您对r.data.category
. 最后,any?
读起来比 好一点(IMO)present?
,特别是因为该值不能是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
重新添加该功能。)