ruby-on-rails – 如何在Ruby on Rails 3中组合范围?
我对Rails很陌生,我似乎无法理解这个:
我有各种各样的项目属于各种客户. 在我的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%' UNION SELECT "projects".* FROM "projects" WHERE "projects".client_id LIKE '%misterx' 有关SQL UNION的更多信息,请访问:http://www.w3schools.com/sql/sql_union.asp (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |