2012-08-03 90 views
0

我是rails新手。這裏是富下面的代碼模型對象:Rails:將兩個查詢合併爲一個

a = Foo 
a = Foo.where(age: 18) 
if params[:sort] == "desc" 
    a = a.order("name desc") 
end 

這裏進行兩個查詢,我想將它們合併到一個或者你可以說我想執行Foo.where(age=18).order("name asc")

記得有可能的情況下,當不需要訂單時,即params [:sort]不等於desc。

,因爲它使代碼冗餘,也爲更多的參數,它可能無法正常工作,請不要給解決像

if params[:sort] == "desc" 
    a = a.where(age=18).order("name desc") 
else 
    a = a.where(age=18) 
end 

+1

附註:恕我直言,重新使用名稱變量不是一個好的編程習慣。隨着時間的推移,用有意義的名稱創建新變量,跟蹤該函數(並調試它)變得更容易。 – tokland 2012-08-03 07:40:26

+0

@tokland將在未來嘗試遵循這一點。 – 2012-08-03 07:42:05

+2

另外,'where(age = 18)'是什麼?它不應該是「哪裏(年齡:18)」或「哪裏(年齡= 18」)? – 2012-08-03 07:44:42

回答

5

不,你錯了。實際上,這裏沒有查詢。

a = Foo 
a = Foo.where(age=18) 
if params[:sort] == "desc" 
    a = a.order("name desc") 
end 

在開始檢索數據的位置發送實際查詢。也就是說,這樣做

a.each do |b| 
    # do something with b 
end 

在那之前,你可以安全鏈標準的建築方法(whereorderselect等)。

+0

可能你是對的,但是當我看着控制檯它顯示我兩個查詢。 – 2012-08-03 07:40:28

+0

也許你做別的事。你可以仔細檢查一下嗎? – 2012-08-03 07:41:36

+0

嘿,我認爲你是對的,它只是我錯誤的人,而不是控制器,我應該在意見中尋找問題。謝謝 :) – 2012-08-03 07:48:59

0

其實你的代碼只會執行一個查詢。這是因爲在rails中,只有在訪問結果後纔會調用數據庫。所以當你寫a.first(或類似的東西)時,它會調用數據庫。

0

如果那是你的意思是......一個簡單的解決辦法是:

a.where(age: 18).order("name #{params[:sort] || 'asc'}") 

所以,如果params[:sort]nil,則默認爲asc