Версия модели Rails - одна модель с независимыми версионными столбцами - PullRequest
0 голосов
/ 25 июня 2011

У меня есть модель для многоязычного веб-сайта с функциональностью вики, которая содержит различные поля, которые я хочу иметь версионными, однако мне нужно отменить изменения, внесенные в некоторые столбцы, но не в другие.

Например, я храню английскую и испанскую версии письменного руководства для каждого экземпляра модели.

Представьте себе:

  • Пользователь A редактирует испанское руководство и добавляет ненормативную лексику
  • Пользователь B позже редактирует руководство на английском языке и вносит полезные изменения.

Обычно управление версиями означает, что отмена изменений, внесенных пользователем A, также отменит более поздние изменения пользователя B, несмотря на тот факт, что в моем случае это две отдельные проблемы.

Так что мне нужно, по сути, иметь ограниченную историю версий. Например, используя papertrail:

#guide.rb
has_paper_trail :only => [:en_title, :en_body]
has_paper_trail :only => [:es_title, :es_body]

Есть ли самое простое решение для этого? Я действительно не хочу перемещать моих гидов в отдельные модели с отношениями один-к-одному только для достижения этой цели.

1 Ответ

1 голос
/ 29 июня 2011

Хотя я бы лично извлек переводы в их собственную модель, чтобы избежать этого, вы все равно сможете достичь этого без особых хитростей.

PaperTrail создает новый объект Version каждый раз при изменении записи.Каждая версия доступна через массив object.versions.

Вам нужно будет найти способ решить, какой атрибут вы хотите вернуть, и к какой версии вы хотите вернуть его обратно.Если у вас есть это, отменить его не должно быть очень сложно.

Например, в вашей модели:

# Arguments:
#   attr - Must respond to to_s with name of attribute to revert
#   ver  - Integer (e.g. -1 for previous version) or actual Version object
def revert_attribute(attr, ver)
  ver = self.versions[ver] if ver.class == Integer
  ver = ver.reify
  self.write_attribute( attr, ver.read_attribute(attr) )
  self.save
end

Код не проверен или не проверен синтаксис, но должен работать счто я видел в источнике PaperTrail.

Это не совсем интегрированное решение, но оно должно подходить для большинства потребностей.

...