我的网络应用程序正在显示文章列表。文章可以在不同的国家出版(即文章属于一个国家,国家有很多文章),并且用不同的语言(即文章属于语言,语言有很多文章)。
我想做的是提出请求,这些请求会返回选定国家和所选语言的文章。也就是说,我最终会提出这样的请求:
Article.selected_countries.selected_languages
并获取文章列表。
对于国家和语言,前端都可以发送以下参数:
"all"
- 这意味着,实际上,不会应用此过滤器,并返回所有国家/地区的文章(或所有语言的文章); 现在,令我困惑的是如何编写这些类方法以及如何使它们可链接。 Rails指南provide以下示例:
class Article < ActiveRecord::Base
def self.created_before(time)
where("created_at < ?", time)
end
end
如果我基于这个例子构建一个类方法,如下所示:
def self.selected_countries(parameter)
???
end
如果parameter
可以是字符串“all”,id的数组或空数组,我如何定义此方法?另外,如果参数为“all”,如何确保过滤器不执行任何操作?
答案 0 :(得分:2)
def self.selected_countries(parameters)
case parameters
when "all"
all
else
where(country_id: parameters)
end
end
后续的范围方法链附加到查询,而不是替换它。
所以你可以把这个范围称为
Article.selected_countries([1]).selected_countries("all")
你将获得国家1的所有文章。
答案 1 :(得分:2)
您所描述的内容称为rails中的范围。 http://guides.rubyonrails.org/active_record_querying.html#scopes
关于范围的好处是(如果写得正确)它们完全支持你想要的那种链接。这是一个范围的示例,如果给定一个空数组,则返回all,否则返回与数组中任何国家/地区关联的记录:
scope : selected_countries, lambda { |countries|
if countries.length == 0
all
else
where(country_id: countries)
end
}
答案 2 :(得分:2)
Rails已经支持您尝试以&#34;范围&#34;的形式实现的目标。您将在RailsGuides中找到您需要知道的所有内容。
http://guides.rubyonrails.org/active_record_querying.html#scopes