Rails:在模型上链接filter方法
我的网络应用程序正在显示文章列表。 文章可以在不同的国家出版(即文章属于一个国家,国家有很多文章),并且使用不同的语言(即文章属于语言,语言有很多文章)。
我想做的是提出请求,从选定的国家和选定的语言返回我的文章。 也就是说,我最终会提出这样的请求:
Article.selected_countries.selected_languages
并获得文章列表。
对于国家和语言,前端都可以发送以下参数:
-
"all"
– 这意味着,有效地,不应用此filter,并返回所有国家/地区的文章(或所有语言的文章); - id的数组 – 这意味着,只返回来自提供id的国家的文章(或者提供id的语言)
- 空数组 – 我想,这是前一个选项的一个特例; 这意味着必须退回来自任何国家(或没有语言)的文章,因此不会退回任何文章
现在,令我困惑的是如何编写这些类方法以及如何使它们可链接。 Rails指南提供以下示例:
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”,如何确保filter不执行任何操作?
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
范围的好处在于(如果写得正确)它们支持您想要的那种链接。 这是一个范围的示例,如果给定一个空数组,则返回all,否则返回与数组中任何国家/地区关联的记录:
scope : selected_countries, lambda { |countries| if countries.length == 0 all else where(country_id: countries) end }
Rails已经以“范围”的forms支持你想要实现的目标。 你会在RailsGuides中找到你需要知道的一切。
http://guides.rubyonrails.org/active_record_querying.html#scopes
- rails has_many setter应该设置条件,如果指定的话
- Ruby / Rails – 我可以使用连接表的范围(或类方法)作为WHERE子句的一部分吗?
- 在不同的Rails应用程序之间共享ActiveRecord模型和数据的最佳方式?
- 创建schema_migrations的Rails – Mysql2 ::错误:指定的键太长了
- 我应该使用ON DELETE CASCADE,:dependent =>:destroy,还是两者都使用?
- RTI中的STI Inheiritance。 查找问题
- Rails 3按顺序排序has_many:通过
- 将Rails中的主键更改为字符串
- 使用ActiveRecord的哈希数组