Първо, first
и last
не са толкова прости, колкото си мислите, че са:вие напълно пренебрегвате limit
аргумент, който и двата метода поддържат.
Второ, scope
е малко повече от изискан начин за добавяне на методи на клас, които са предназначени да връщат заявки. Вашите обхвати злоупотребяват с scope
защото те връщат единични екземпляри на модела, а не заявки. Не искате да използвате scope
изобщо, вие просто се опитвате да замените first
и last
методи на клас, така че защо просто не ги замените? Все пак ще трябва да ги замените правилно и това ще изисква четене и разбиране на източника на Rails, така че правилно да имитирате какво find_nth_with_limit
прави. Бихте искали да замените second
, third
, ... и останалите глупави методи, докато сте там.
Ако не смятате, че трябва да замените first
и last
(добро нещо IMO), тогава можете да добавите обхват по подразбиране, за да подредите нещата по желание:
default_scope -> { order(:created_at) }
Разбира се, обхватите по подразбиране идват със собствен набор от проблеми и промъкването на неща в ORDER BY по този начин вероятно ще ви принуди да извикате reorder
всеки път, когато действително искате да посочите ORDER BY; запомнете, че множеството извиквания към order
добавете нови условия за поръчка, те не заместват вече съществуващите.
Като алтернатива, ако използвате Rails6+, можете да използвате implicit_order_column
на Markus решение
за да избегнете всички проблеми, които могат да причинят обхватите по подразбиране.
Мисля, че мислите погрешно. Всеки път, когато видя M.first
Предполагам, че нещо е забравено. Подреждане на неща по id
е почти безполезен, така че трябва да винаги ръчно задайте реда, който искате, преди да използвате методи като first
и last
.