Кой е най-добрият начин за внедряване на отмяна в стил gmail в Rails?

Мисля, че е важно да има метод „отмяна“ като gmail, когато се унищожават записи, вместо да се показва досаден изскачащ прозорец, който казва „Сигурни ли сте?".

Начинът, по който внедрих това, е да имам колона с клеймо за време "deleted_at" в модела, която получава клеймо за време, когато се извика методът destroy

def destroy
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, Time.now)
  ...
end

За връщане/отмяна просто ще задам същата колона на нула

def revert
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, nil)
  ...
end

Просто ще трябва да добавя условие за филтриране на "изтритите" foos, когато извикам метода за намиране. Може би задайте cron или фонова задача, за да унищожите наистина "изтритите" foos след известно време.

Работи за мен и е лесен за внедряване, но съм любопитен дали има по-добър начин за внедряване на тази функция? Може би има плъгин или скъпоценен камък, който предоставя това, за което не знам?


person JasonOng    schedule 14.10.2008    source източник
comment
Наистина ли те интересува кога е изтрито? Знамето не е ли достатъчно?   -  person Brad Wilson    schedule 14.10.2008
comment
Да, засега не ме интересува кога е бил изтрит, но това знание може да е полезно в бъдеще. Както и да е, мисля, че времевите клейма са добър флаг.   -  person JasonOng    schedule 15.10.2008
comment
Съгласен съм с общото настроение. Въпреки това, един възможен проблем чрез изпреварване на такива нужди е, че това може да подмами други разработчици да търсят къде тази информация (клеймо за време) се използва в момента. Когато всъщност не се използва някъде, той представлява разхлабена нишка, която често е разочароваща и отнема време за непосветените.   -  person Magne    schedule 18.05.2011


Отговори (5)


Наистина има някои добавки, които могат да бъдат намерени на Agile Web Development.

Ето връзките и обобщенията за добавките, които изглежда отговарят на вашето описание:

  1. Действа като параноик: Направете активните си записи „параноични“. Изтриването им не изтрива реда, но задава поле deleted_at. Търсенето е претоварено, за да пропусне изтритите записи.
  2. Действа като меко изтриване: Предоставя възможност за меко изтриване на модели на ActiveRecord.
person Tilendor    schedule 14.10.2008
comment
Изглежда, че Acts As Paranoid може да има проблеми с бъдещите версии на ActiveRecord, тъй като отменя метода за намиране. Действа като меко изтриване изглежда добре. Просто се чудя, ако deleted_table излезе от синхронизиране, как да го синхронизирам отново? Използвали ли сте някой от тях преди? - person JasonOng; 15.10.2008
comment
Не, но в описанието на soft deletetable се казва, че има вградени помощни методи, за да ги поддържа в синхрон - person Tilendor; 15.10.2008
comment
Кратък преглед на двете прави да изглежда, че Acts as soft deleteable би бил по-добрият избор, както за използвания метод, така и за факта, че изглежда по-добре поддържан. - person Sam Murray-Sutton; 07.08.2009

Има файл тук, който изглежда прави това, което вие re изисква, но лично аз смятам, че трябва да има нещо, което автоматично филтрира изтритите записи, освен ако не ги включите изрично. По този начин те наистина ще изглеждат изтрити, освен ако не включите параметър или наименуван обхват, който ги включва отново.

За съжаление не съм написал нито едно и свободното време е ограничено, но не би трябвало да е толкова трудно, нали?

person Andy Jeffries    schedule 14.10.2008

Можете да преместите изтритите елементи в отделна колекция (или таблица, или каквото и да е) - тогава всичко, което търси в оригиналния списък, ще види, че е изтрито, и можете да се справите с новия списък, когато е удобно.

person Robin Bennett    schedule 14.10.2008

PaperTrail прави това добре. Има добър Railscast за него, въпреки че вече е малко стар . Знам, че този въпрос беше зададен преди доста време, но случайно попаднах на него от любопитство и реших, че трябва да се позова на добър актуален начин за това.

person bmac151    schedule 11.07.2013

модел на веригата за отговорност

class Action
{
  Perform(context);
  Undo(context);
}
person user27732    schedule 14.10.2008
comment
Това е много неясно и не ми дава представа как всъщност да направя отмяната. какъв е контекстът? как взаимодейства с базата данни? - person Tilendor; 19.05.2011