在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”,这意味着结果将是符合两个条件的条件,而不是条件。
有几种方法可以检索具有特定名称的项目或属于客户端的项目。最简单的方法是创建一个新的范围,指定或运算符:
scope :search_by_name_or_client, lambda { |name, client| where('name LIKE ? OR client_id LIKE ?', "%#{name}%", "%#{client}%") }
您可能也想看看SQL工会,它结合了结果集的两个或更多个SELECT语句。 ActiveRecord的不处理UNION的功能,但也有宝石来扩展功能,包括这一点,如https://github.com/tsmango/union
而且例如写这个使用联盟宝石是这样的:
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'
更多关于UNION的SQL语句的信息可以在这里找到:http://www.w3schools.com/sql/sql_union.asp
是什么你的控制器看起来像? – 2012-02-25 17:20:17
就像这样:'@projects = current_user.projects.search_by_name(PARAMS [:名字])。search_by_client(PARAMS [:客户端])' – Tintin81 2012-02-25 17:55:34