我们正在 Ruby on Rails 中创建一个系统,我们希望能够为我们的用户提供一些关于在某些预定义触发器发生时可能发生的通知和操作的控制。此外,我们计划遍历导入的数据并允许我们的用户根据该数据配置一些操作和触发器。
让我举几个例子来更好地说明:
Trigger - Action
------------------------------------------------------------------------
New Ticket is Created - User receives an e-mail
New Ticket Parsed for Keyword 'evil' - Ticket gets auto-assigned to a
particular group
User Missed 3 Meetings - A ticket is automatically created
理想情况下,我们希望某些触发器是可配置的。例如,最后一个示例可能让您配置在操作发生之前错过了多少次 session 。
我想知道什么模式可以帮助我在 Ruby on Rails 中处理这个事件/回调情况。此外,触发器和 Action 可能是可配置的,但它们将是预定义的;那么,它们应该被硬编码还是存储在数据库中?
任何想法将不胜感激。谢谢!
更新 1:看了之后发现SO上的徽章系统有点类似,基于这些标准,我想做这个 Action 。它略有不同,但我希望能够轻松添加新标准和操作并将它们呈现给用户。任何与此相关的想法?
最佳答案
我认为你正在寻找的是观察者。
在你的例子中,观察者可以处理第一个和第三个例子(但不是第二个,因为观察者只观察对象,而不是与它交互,即使它在技术上是可能的)。
一些代码来显示我的意思:
class TicketObserver < ActiveRecord::Observer
def after_create(ticket)
UserMailer.deliver_new_ticket_notification
end
end
class UserObserver < ActiveRecord::Observer
def after_update(user)
Ticket.new if user.recently_missed_a_meeting and user.missed_meetings > 3
end
end
然后将观察者添加到 environment.rb
config.active_record.observers = :user_observer, :ticket_observer
当然,您必须填写missed_meetings 的逻辑,但要提及一个细节。
由于 after_update 会在每次用户更新后触发,
recently_missed_a_meeting
属性很有用。我通常遵循restful-authentication的想法,并且每次我想触发该行时都会将一个实例变量设置为true。这可以在回调或某些自定义逻辑中完成,具体取决于您跟踪 session 的方式。对于第二个例子,我会把它放在
before_update
中。回调,也许在查找表中包含关键字,以让用户更新应触发移动到特定组的单词。
关于ruby-on-rails - Ruby on Rails 中的触发器/回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1925026/