2015-08-14 19 views
0

我有以下查詢其翻出結果的一套基於的IDs導軌和聯接排除特定的ID

User.joins(:memberships). 
    where(plan_memberships: { user_id: attendee_ids, plan_id: plan.id }) 

陣列上現在我想要做的另一個呼叫不包括attendee_ids然後CONCAT與上述結果先保留attendee_ids的結果順序,然後再保留。

有沒有辦法根據某些ID先保留結果的順序,然後顯示剩餘結果?

+0

是什麼'plan_memberships'? –

+0

我猜測:plan_memberships與會員資格是同義的,它看起來像票證中可能有一個錯字。 – AJFaraday

+0

是啊@AJFaraday是對的:)只是把它改名爲'會員'以方便使用 –

回答

1

我覺得你的情況最好的辦法是由兩個的數據庫查詢檢索單獨的結果是不同的。

common_scope = User.joins(:memberships).where(plan_memberships: { plan_id: plan.id }) 

excluded = common_scope.where.not(plan_memberships: { user_id: attendee_ids }) 
encluded = common_scope.where(plan_memberships: { user_id: attendee_ids }) 

all_sorted = excluded + encluded 

Answer to additional question:

如果你想獲取一定數量的記錄,你可以這樣來做:

common_scope = User.joins(:memberships).where(plan_memberships: { plan_id: plan.id }) 
excluded_scope = common_scope.where.not(plan_memberships: { user_id: attendee_ids }) 
encluded_scope = common_scope.where(plan_memberships: { user_id: attendee_ids }) 

number = 3 

excluded = excluded_scope.limit(number) 
size = excluded.size 

if size < number 
    encluded = encluded_scope.limit(number - size) 
    all_sorted = excluded + encluded 
else 
    all_sorted = excluded 
end 
+0

哦好吧。將做到這一點:) –

+0

有沒有辦法增加超過所有限制的3個記錄呢? –

+0

我編輯了我的答案。 – chumakoff

1

您可以嘗試注入一些SQL來涵蓋排除案例。

User.joins(:memberships). 
    where(plan_memberships: { user_id: attendee_ids, plan_id: plan.id }). 
    where('plan_memberships.user_id not in (?)', banned_user_ids) 

注:這可能取決於您選擇的數據庫