我有以下查詢其翻出結果的一套基於的IDs
導軌和聯接排除特定的ID
User.joins(:memberships).
where(plan_memberships: { user_id: attendee_ids, plan_id: plan.id })
陣列上現在我想要做的另一個呼叫不包括attendee_ids
然後CONCAT與上述結果先保留attendee_ids
的結果順序,然後再保留。
有沒有辦法根據某些ID先保留結果的順序,然後顯示剩餘結果?
我有以下查詢其翻出結果的一套基於的IDs
導軌和聯接排除特定的ID
User.joins(:memberships).
where(plan_memberships: { user_id: attendee_ids, plan_id: plan.id })
陣列上現在我想要做的另一個呼叫不包括attendee_ids
然後CONCAT與上述結果先保留attendee_ids
的結果順序,然後再保留。
有沒有辦法根據某些ID先保留結果的順序,然後顯示剩餘結果?
我覺得你的情況最好的辦法是由兩個的數據庫查詢檢索單獨的結果是不同的。
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
您可以嘗試注入一些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)
注:這可能取決於您選擇的數據庫
如果你正在使用MySQL有保留基於訂單的選項在你有一個數組中的ID。
field(user_id, [array of ids])
欲瞭解更多詳情,您可以點擊這裏http://www.electrictoolbox.com/mysql-order-specific-field-values/
是什麼'plan_memberships'? –
我猜測:plan_memberships與會員資格是同義的,它看起來像票證中可能有一個錯字。 – AJFaraday
是啊@AJFaraday是對的:)只是把它改名爲'會員'以方便使用 –