Руководство по проектированию Rails: ограничение действий пользователя до X вхождений / день, уведомление модераторов и пользователей определенных действий - PullRequest
0 голосов
/ 24 января 2011

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

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

Кроме того, у меня на сайте есть модераторы, которые возвращаются и просматривают записи, поданные «Я не знаю». Я хотел бы, чтобы модераторы получали уведомления о любых новых ответах «Я не знаю», когда они заходят на сайт, чтобы они могли посмотреть и исправить запись.

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

Что я действительно хочу знать, это:

  1. Соответствует ли этот тип проблемы определенному шаблону, который вам известен? (IE: есть термин, который я мог бы использовать в Google, чтобы он указывал мне на хорошие ресурсы о том, как справиться с такой ситуацией)
  2. Знаете ли вы о некоторых хороших чтениях / учебных пособиях, которые могут быть полезны.
  3. Самое главное, можете ли вы дать некоторые рекомендации относительно того, как решить эту проблему "Rails way"?

Спасибо!

-EDIT- Чтобы внести некоторую ясность в то, на что я действительно надеюсь: если бы у вас была такая потребность на вашем сайте, как бы вы ее решили? Вы бы использовали наблюдателя? Вы делаете атрибут в модели, и наблюдатель «манипулирует» этим, или вы сохраняете весь код в наблюдателе. Есть ли другой способ решить эту проблему?

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

Мне известно, что я могу использовать Наблюдатели как часть решения, но я не знаю, как лучше всего сказать наблюдателю, чтобы он заметил, что что-то произошло трижды за 24 часа ... такого рода вещи или узнать, прочитал ли кто-нибудь уведомление.

Спасибо!

Ответы [ 5 ]

1 голос
/ 27 января 2011

Для накапливания (чуть более подробно)

1) Используйте пользовательскую проверку, где вы проверяете идентификатор_пользователя, ответ и обновленный_ат. Если ответ «Я не знаю» появляется более X раз, когда updated_at> 1.day.ago ... не прошел проверку

2) Вам понадобится «постоянный обмен мгновенными сообщениями». Это означает, что вам потребуется модель FlashMessage, в которой вы сохраняете сообщения для отображения пользователям при входе в систему. Для этого понадобятся следующие поля: user_id, message, is_read (boolean)

3) Наконец, вам понадобится наблюдатель на столе, который имеет валидатор (упомянутый в пункте 1). Этот наблюдатель запишет в таблицу flash_messages "after_create"

1 голос
/ 27 января 2011

Я полагаю, что вы описываете здесь, по сути, " рабочий процесс ". Для академического подхода см .:

http://www.workflowpatterns.com/patterns/control/index.php

Но это может быть очень сложно. Я думаю, что лучше попытаться решить проблемы просто.

Для сценариев сохранения вашего пользователя / модератора я рекомендую прочитать об обратных вызовах:

http://edgeguides.rubyonrails.org/active_record_validations_callbacks.html#available-callbacks

Например, вы могли бы использовать обратный вызов after_create, чтобы сделать что-то, когда пользователь изначально сохраняет запись, и обратный вызов after_update, когда модератор или пользователь обновил запись (вы можете добавить условие, чтобы определить, какой тип пользователя обновляет запись и отвечает соответственно). ['after_save "охватывает случаи создания и обновления.]

В ваших представлениях вы можете разрешить пользователю выполнять фильтрацию по состоянию записи. Например, пользователь может захотеть просмотреть все проверяемые записи или только те записи, которые были переназначены им модератором. На основании состояния записи вы можете визуально предупредить пользователя (например, выделить строку).

Это мало чем отличается от системы отслеживания ошибок. Ошибки, введенные в систему, могут быть изначально отменены и получены пользователем-программистом или назначены программисту с самого начала. Программист вносит исправления, обновляет состояние, а затем может потребоваться пересмотреть исправление другим типом пользователя, например тестером. Если ошибка не была устранена, тестировщик может переназначить элемент программисту.

Это рабочий процесс.

Что касается «Я не знаю», вы могли бы реализовать это как счетчик, но вам также нужно будет отслеживать дату, чтобы вы могли ежедневно сбрасывать ее, используя задачу расписания, или с помощью какого-либо пользовательского события, такого как Войти.

1 голос
/ 24 января 2011

Разве вы не можете использовать активный наблюдатель записи для этого? В руководстве Ruby on Rails есть несколько примеров их использования.

0 голосов
/ 28 января 2011

Предположим, что вы отслеживаете качество поля с именем category в вашей модели Book.

Добавьте наблюдателя (data_quality_observer.rb) в каталог models.

class DataQualityObserver < ActiveRecord::Observer
   observe :book  
   def after_save(book)
     book.process_incomplete_category
     book.process_complete_category
   end
end

Зарегистрировать наблюдателя в config\environment.rb

Rails::Initializer.run do |config|
  # ..
  # ..
  config.active_record.observers = :data_quality_observer
end

Модель книги:

class Book
  INCOMPLETE_CATEGORY = "I don't know."

  def complete_category?
    category != INCOMPLETE_CATEGORY
  end

  def process_incomplete_category
    return if complete_category?

    k = Book.count(
      :conditions => ["user_id = ? AND category = ? AND updated_at > ?", 
        self.user_id, INCOMPLETE_CATEGORY, 1.day.ago]
    )

    UserMailer.deliver_incomplete_category_notification(self)  if ( k > 3)    
  end

  # if the category became complete
  def process_complete_category
    return unless complete_category?
    return unless (category_was == INCOMPLETE_CATEGORY)

    # do additional check to ensure admin did the changes
    UserMailer.deliver_complete_category_notification(self)
  end

end

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

class UserMailer < ActionMailer::Base

  def incomplete_category_notification(book)
    from        "bot@domain.com"
    sent_on     Time.now      
    recipients  "admin@domain.com"
    body        :book => book   
    subject     "User #{book.user.name} has entered 3 incomplete categories"    
  end

  def complete_category_notification(book)
    from        "bot@domain.com"
    sent_on     Time.now      
    recipients  book.user.email
    body        :book => book   
    subject     "The category field was updated for a record you created"    
  end

end
0 голосов
/ 27 января 2011
class YourObserver < ActiveRecord::Observer
   observe :model_to_observe

   # an example of callback
   def after_save(model_to_observe)
      #some stuff to check and do
   end
end

и в вашем приложении .rb

config.active_record.observers = :you_observer

Приветствия

...