Rails:在模型上链接过滤器方法
Rails: Chaining filter methods on a model
我的网络应用程序正在显示文章列表。文章可以在不同的国家发表(即一篇文章属于一个国家,而一个国家有很多篇文章),也可以用不同的语言发表(即一篇文章属于一种语言,而语言有很多篇文章)。
我想做的是提出请求,这些请求将 return 我的文章来自选定的国家和选定的语言。也就是说,我最终想提出这样的要求:
Article.selected_countries.selected_languages
并获取文章列表。
对于国家和语言,前端可以发送以下参数:
"all"
— 这意味着,实际上,不应用此过滤器,并且 return 来自所有国家/地区的文章(或所有语言的文章);
- id 数组 — 这意味着,return 文章仅来自具有提供的 id 的国家(或具有提供的 id 的语言)
- 空数组——我想,这是前一个选项的特例;这将意味着来自任何国家(或任何语言)的文章都必须 returned,因此不会 returned
文章
现在,令我困惑的是如何编写这些 class 方法以及如何使它们可链接。 Rails 指导 provide 以下示例:
class Article < ActiveRecord::Base
def self.created_before(time)
where("created_at < ?", time)
end
end
如果我根据这个例子构建一个class方法,比如下面这样:
def self.selected_countries(parameter)
???
end
如果 parameter
可以是字符串 "all"、id 数组或空数组,我该如何定义此方法?另外,如果参数为 "all"?
,我如何确保过滤器不执行任何操作
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 的所有文章。
您所描述的在 rails 中称为范围。
http://guides.rubyonrails.org/active_record_querying.html#scopes
作用域的好处在于(如果写得正确)它们完全支持您想要的链接类型。这是一个范围的示例,它 returns 全部如果给定一个空数组,否则它 returns 记录与数组中的任何国家相关联:
scope : selected_countries, lambda { |countries|
if countries.length == 0
all
else
where(country_id: countries)
end
}
Rails 以 "scopes" 的形式内置了对您想要实现的目标的支持。您会在 Rails 指南中找到您需要了解的一切。
http://guides.rubyonrails.org/active_record_querying.html#scopes
我的网络应用程序正在显示文章列表。文章可以在不同的国家发表(即一篇文章属于一个国家,而一个国家有很多篇文章),也可以用不同的语言发表(即一篇文章属于一种语言,而语言有很多篇文章)。
我想做的是提出请求,这些请求将 return 我的文章来自选定的国家和选定的语言。也就是说,我最终想提出这样的要求:
Article.selected_countries.selected_languages
并获取文章列表。
对于国家和语言,前端可以发送以下参数:
"all"
— 这意味着,实际上,不应用此过滤器,并且 return 来自所有国家/地区的文章(或所有语言的文章);- id 数组 — 这意味着,return 文章仅来自具有提供的 id 的国家(或具有提供的 id 的语言)
- 空数组——我想,这是前一个选项的特例;这将意味着来自任何国家(或任何语言)的文章都必须 returned,因此不会 returned 文章
现在,令我困惑的是如何编写这些 class 方法以及如何使它们可链接。 Rails 指导 provide 以下示例:
class Article < ActiveRecord::Base
def self.created_before(time)
where("created_at < ?", time)
end
end
如果我根据这个例子构建一个class方法,比如下面这样:
def self.selected_countries(parameter)
???
end
如果 parameter
可以是字符串 "all"、id 数组或空数组,我该如何定义此方法?另外,如果参数为 "all"?
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 的所有文章。
您所描述的在 rails 中称为范围。 http://guides.rubyonrails.org/active_record_querying.html#scopes
作用域的好处在于(如果写得正确)它们完全支持您想要的链接类型。这是一个范围的示例,它 returns 全部如果给定一个空数组,否则它 returns 记录与数组中的任何国家相关联:
scope : selected_countries, lambda { |countries|
if countries.length == 0
all
else
where(country_id: countries)
end
}
Rails 以 "scopes" 的形式内置了对您想要实现的目标的支持。您会在 Rails 指南中找到您需要了解的一切。
http://guides.rubyonrails.org/active_record_querying.html#scopes