2015-03-19 106 views
0

我正在創建一個應用程序,在此之後必須先顯示標記的圖像,之後我必須顯示正常圖像,之後我必須顯示被拒絕的圖像,現在我使用3種不同的查詢,然後將其收集到一個數組中,它看起來像一個錯誤的實現,是否有一個查詢將幫助我實現下面提到的功能,以便我也可以使用它分頁。Rails活動記錄查詢按特定順序獲取數據

我目前的實施情況如下。

images = [] 
images << @campaign.pictures.where("is_pinned = ?", true) 
images << @campaign.pictures.where("is_pinned = ? AND is_rejected = ?", false, false) 
images << @campaign.pictures.where("is_rejected = ?", true) 

回答

0

如果你想在一個查詢/線,您目前通過SQL字符串來做到這一點:

images = @campaign.pictures.where("is_pinned = ? OR (is_pinned = ? AND is_rejected = ?) OR is_rejected = ?", true, false, false, true) 

將會有另一種選擇once the or method is introduced in Rails 5

除此之外,如果你不關心效率,你可以讓它看起來與哈希語法稍微漂亮:

images = [] 
images << @campaign.pictures.where(is_pinned: true) 
images << @campaign.pictures.where(is_pinned: false, is_rejected: false) 
images << @campaign.pictures.where(is_rejected: true) 
+0

我已經嘗試了上面的查詢,但它沒有按照正確的順序安排數據,因爲我需要 – 2015-03-20 06:54:17

0

上的ActiveRecord ::關係只是爲了:

images = @campaign.pictures.order('is_pinned desc, is_rejected') 

現在images是ActiveRecord :: Relation的一個實例,您可以對它進行分頁。

關鍵在於訂單條款。

注意:我認爲你不能同時記錄固定和拒絕記錄,如果不是,你的初始解決方案可能有重複。

+0

我可以做到這一點,但在這種情況下,我將首先獲取固定圖像,然後我會得到被拒絕的圖像,我首先需要固定的圖像我需要正常的圖像,然後我需要被拒絕的圖像 – 2015-03-20 06:56:09

+0

如果你有一個'''default_scope''在模型上定義了一個順序(使用'''reorder '''而不是'''order''')。或者,您在該字段上有空值。或者,也許你在這兩個領域都沒有虛假記錄(普通圖像?)。但是,我認爲這個順序給出了你原來的'''images'''數組的相同順序。 – 2015-03-20 10:42:40