我对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 。
现在有一种组合这两个搜索功能的方法,以便查询
/projects?search=foofoo
将检索名为 foofoo 的项目以及属于名为 foofoo 的客户的项目?
感谢您的帮助!
答案 0 :(得分:7)
在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