2011-02-24 89 views
0

是否可以分阶段构建查询?Ruby On Rails 3 ...构建查询块

例:

可以说我有使用用户名搜索表单,姓氏,活跃,任何的可能是空白/填充

有查询,应根据该场一起进行或运算正在填写:

SELECT * FROM表其中username =“某某”或姓氏=“ABC”或主动=“XYZ”

,但它可能会导致只有2场被查询...我需要以某种方式想出如何或查询而不做某事兴奋得像弦乐建筑。

+0

回报率是懒惰的,查询不会被执行,直到需要 – Jimmy 2011-02-24 21:00:28

+0

所以,你的搜索页面上,如果我搜索用户名“约翰”和姓“强生”,要与任何用户名作为“回报所有用户约翰“或姓”约翰逊“? – 2011-02-24 21:19:59

+1

是的,这是一个或所有的 – 2011-02-24 21:22:17

回答

3

可以在Rails 3中做到这一点:

ut = User.arel_table 
User.where(ut[:username].eq('xyz').or(ut[:last_name].eq('xyz')).\ 
    or(ut[:active].eq('xyz'))) 

主要生产:

SELECT "users".* FROM "users" WHERE ((("users"."username" = 'xyz' 
    OR "users"."last_name" = 'xyz') OR "users"."active" = 'xyz')) 
6

如果你使用的是Rails 3,你可以使用arel的链接和它们在一起。

@users = User.scoped 
@users = @users.where(:username => params[:username]) unless params[:username].blank? 
@users = @users.where(:last_name => params[:last_name]) unless params[:last_name].blank? 

但是,arel不支持或条件(尚未)进行字符串构建。

+2

虽然这些“AND”条件在一起吗? – ryeguy 2011-02-24 21:01:12

+0

那么字符串建设的唯一途径?这看起来很疯狂 – 2011-02-24 21:07:16

0

在Rails3中更简单的方法,而无需使用阿雷尔会不喜欢它:

options = {} options.merge({:username => params [:username]})除非params [:username] .blank? options.merge({:last_name => params [:last_name]})除非params [:last_name] .blank?

@users = User.where(选项)

有可能构建一个选项取决于你是如何暴露的属性的形式直接敲定则params的一些非常聪明的办法。

我们的Arel仅限于上述方法,您可以使用等号以外的运算符(如不在或类似)。

如果你想真正利用所有可能的组合来看看Squeel,或者如果你想走得更远了一步,并希望整个搜索建立你看看整合检索或MetaWhere

观看Railscast由Ryan贝茨 http://railscasts.com/episodes/251-metawhere-metasearch