2011-02-24 87 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