是否可以分階段構建查詢?Ruby On Rails 3 ...構建查詢塊
例:
可以說我有使用用戶名搜索表單,姓氏,活躍,任何的可能是空白/填充
有查詢,應根據該場一起進行或運算正在填寫:
SELECT * FROM表其中username =「某某」或姓氏=「ABC」或主動=「XYZ」
,但它可能會導致只有2場被查詢...我需要以某種方式想出如何或查詢而不做某事興奮得像絃樂建築。
是否可以分階段構建查詢?Ruby On Rails 3 ...構建查詢塊
例:
可以說我有使用用戶名搜索表單,姓氏,活躍,任何的可能是空白/填充
有查詢,應根據該場一起進行或運算正在填寫:
SELECT * FROM表其中username =「某某」或姓氏=「ABC」或主動=「XYZ」
,但它可能會導致只有2場被查詢...我需要以某種方式想出如何或查詢而不做某事興奮得像絃樂建築。
可以在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'))
如果你使用的是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不支持或條件(尚未)進行字符串構建。
雖然這些「AND」條件在一起嗎? – ryeguy 2011-02-24 21:01:12
那麼字符串建設的唯一途徑?這看起來很瘋狂 – 2011-02-24 21:07:16
在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
回報率是懶惰的,查詢不會被執行,直到需要 – Jimmy 2011-02-24 21:00:28
所以,你的搜索頁面上,如果我搜索用戶名「約翰」和姓「強生」,要與任何用戶名作爲「回報所有用戶約翰「或姓」約翰遜「? – 2011-02-24 21:19:59
是的,這是一個或所有的 – 2011-02-24 21:22:17