Вести журнал пользовательских событий в рельсах - PullRequest
5 голосов
/ 30 августа 2011

В настоящее время я пытаюсь создать журнал для раздела администрирования моего приложения rails. Это позволит администратору видеть, какие действия выполнил пользователь и когда. E.g "Пользователь добавил новый адрес", "Пользователь обновил свой почтовый индекс с X на Y".

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

class CreateLogs < ActiveRecord::Migration
  def self.up
    create_table :logs do |t|
      t.integer :user_id
      t.integer :marker_id
      t.integer :administrator_id
      t.integer :group_id
      t.integer :assignment_id
      t.integer :submission_id
      t.integer :code
      t.text :message

      t.timestamps
    end
  end

  def self.down
    drop_table :logs
  end
end

Меня беспокоит то, что, например, пользователь может (скажем, добавить назначение в свою учетную запись), он регистрируется как

Log.create(:user_id => current_user.id, :assignment_id => the_assignment.id, :code => 342, :message => '')

(где-то код 342 соответствует «Пользователь создал новый адрес», следовательно, сообщение не нужно)

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

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

В качестве альтернативы, я мог бы сохранить всю запись в виде текстового сообщения, но разве это не было бы очень плохо, и без необходимости заполнять базу данных?

Дайте мне знать, если что-то из этого неясно, просто подумайте, что регистрация действий / событий приложения должна была быть сделана раньше!

Спасибо

Пит

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

Посмотрите на камни, перечисленные в ActiveRecord Versioning , это, вероятно, то, что вам нужно.

1 голос
/ 15 февраля 2012

Я думаю, что вы нашли хорошее решение с использованием необработанного текста вместо (или в дополнение к) идентификаторов. Если вы храните имена пользователей и адреса, это, вероятно, не приведет к поломке хранилища. Это в значительной степени то, как это делает файл журнала; это выплевывает, кто что сделал и когда это случилось. Я не думаю, что это вообще помешает вашей БД хранить некоторые дополнительные данные в тексте. Однако, если он действительно стал массовым, вы всегда можете просто сохранить журналы за последние несколько недель. Может быть, есть какая-то работа, которая очищает любые файлы журнала, которые старше 4 недель. Но это в основном зависит от уровня регистрации ваших действий: если вы регистрируете каждое отдельное действие, выполняемое пользователем, это становится действительно большим. Если вы просто заинтересованы в ключевых событиях (пользователь вошел / вышел, создал / обновил / удалил что-то и т. Д.), То я думаю, что вы прекрасно сохраняете текст и очищаете его время от времени.

...