Rails:around_save回调有条件地触发特定于一个属性的操作?

时间:2014-04-08 22:54:42

标签: ruby-on-rails callback

我的Rails应用有活动和用户。如果/当它们被添加到事件中时,我需要向用户发送消息,无论是正在创建的新事件还是正在更新的现有事件。为了避免多次发送消息,我正在考虑这样的设计模式:

class Event < ActiveRecord::Base
  has_many :users
  around_save :contact_added_users

  def contact_added_users
    existing_users = self.users
    yield
    added_users = self.users.reject{|u| existing_users.include? u }
    added_users.each { |u| u.contact }
  end
end

这是一种明智的做法吗?我不确定如何将此功能用于条件回调模式。

编辑:我发现这不起作用,因为added_users将始终为空。

更新:为了尽量减少与现有代码的冲突,我想我将避免在模型中使用回调,而是在控制器中使用around过滤器。此外,这允许我在将现有用户附加到事件对象之前查询数据库。像这样的东西(使用ActiveAdmin):

ActiveAdmin.register Event do
  controller do
    around_filter :contact_added_users

    def contact_added_users
      @event = Event.find(params[:id])
      existing_users = @event.users
      yield
      added_users = @event.users.reject{|u| existing_users.include? u }
      added_users.each { |u| u.contact }
    end
  end
end

0 个答案:

没有答案