
我有各种各样的项目属于各种客户.
在我的Project模型中,我有两个搜索功能:
scope :search_by_name,lambda { |fn| where('name liKE ?',"%#{fn}%") }scope :search_by_clIEnt,lambda { |fn| where('clIEnt_ID liKE ?',fn) } 两者似乎都有效.例如,在URL中,我可以传递此查询:
/projects?search_by_name=fooproject
我同样可以这样做:
/projects?search_by_clIEnt_name=misterx
这将产生属于客户端MisterX的所有项目.
现在有一种方法可以将这两个搜索功能组合在一起以便进行查询
/projects?search=foofoo
将检索名为foofoo的项目以及属于名为foofoo的客户端的项目?
谢谢你的帮助!
解决方法 在sql中,您可以按多个条件进行搜索.您已定义了两个作用域,它们可以按如下方式链接在一起:Project.search_by_name('fooproject').search_by_clIEnt('misterx') 这将创建以下sql:
SELECT "projects".* FROM "projects" WHERE "projects".name liKE '%fooproject%' AND "projects".clIEnt_ID liKE '%misterx'
加入这两个条件的运算符是“AND”,这意味着结果将是满足两个条件的结果,而不是任何一个条件.
有几种方法可以检索具有特定名称的项目或属于客户端的项目.最简单的方法是创建一个指定OR运算符的新作用域:
scope :search_by_name_or_clIEnt,lambda { |name,clIEnt| where('name liKE ? OR clIEnt_ID liKE ?',"%#{name}%","%#{clIEnt}%") } 您可能还想查看sql UNION,它结合了两个或多个select语句的结果集. ActiveRecord不处理UNION功能,但有一些宝石可以扩展功能以包含它,例如https://github.com/tsmango/union
使用Union gem编写此示例的示例如下所示:
Project.union([{:conditions => ['name like ?',"%#{name}%"]},{:conditions => ['clIEnt like ?',"%#{clIEnt}%"]}]) 这将生成以下sql:
SELECT "projects".* FROM "projects" WHERE "projects".name liKE '%fooproject%'UNIONSELECT "projects".* FROM "projects" WHERE "projects".clIEnt_ID liKE '%misterx'
有关sql UNION的更多信息,请访问:http://www.w3schools.com/sql/sql_union.asp
总结以上是内存溢出为你收集整理的ruby-on-rails – 如何在Ruby on Rails 3中组合范围?全部内容,希望文章能够帮你解决ruby-on-rails – 如何在Ruby on Rails 3中组合范围?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)