1

我有两个模型:Campaign 和 Contact。

一个活动有_许多联系人。

一个联系人 has_many 活动。

目前,每个联系人都有一个contact.date_entered 属性。一个活动使用该日期作为开始倒计时到属于该活动的不同事件。

但是,在某些情况下,特定联系人的活动可能需要延迟 X 天。在本例中,campaigncontact.delaydays = 10。

在某些情况下,必须完全停止特定联系人的活动,所以现在我设置campaigncontact.delaydays = 1。(这有什么大问题吗?)

默认情况下,我假设不存在活动联系人(但不确定它是如何工作的?)

所以这就是我试图做的事情:

class Contact < ActiveRecord::Base
  has_many :campaigncontacts
  has_many :campaigns, :through => :campaigncontacts
end

class Campaign < ActiveRecord::Base
  has_many :campaigncontacts
  has_many :contacts, :through => :campaigncontacts
end

script/generate model campaigncontact campaign_id:integer contact_id:integer delaydays:integer

class Campaigncontact < ActiveRecord::Base
  belongs_to :campaign
  belongs_to :contact
end

那么,问题来了:上面的说法正确吗?如果是这样,我如何允许用户编辑特定联系人的活动延迟。

现在,我想从联系人视图中执行此操作。

这是我尝试过的:

在联系人控制器 (?)

  in_place_edit_for :campaigncontact, column.delaydays

在视图中

<%= in_place_editor_field :campaigncontact, :delaydays %>

我怎样才能正确?

4

2 回答 2

1

我会在名为 days_to_delay_communication_by 的 Campaigncontacts 资源中添加一个整数字段,因为此信息与活动和联系人的关联有关,而不是与联系人本身相关。

在您的迁移中:

def self.up
  add_column(:campaigncontacts, :days_to_delay_communication_by, :integer)
end

def self.down
  remove_column(:campaigncontacts, :days_to_delay_communication_by)
end

现在您可以通过以下方式设置该值:

campaigncontact = Campaigncontacts.find(:first, :conditions => { :campaign_id => campaign_id, :contact_id => contact_id })
campaigncontact.days_to_delay_communication_by = 10

然后在应用程序的管理端,您可以拥有一个控制器和一个活动通信视图,让您可以为活动联系人设置 days_to_delay_communication_by 字段。如果你有兴趣,我可以为你进一步扩展,但我想你明白了。

然后,您需要运行某种后台进程(可能是 cron 作业,或使用延迟作业插件),以查找尚未发生的通信,并在日期过去后使它们发生。您可以像这样在 rake 任务中执行此操作:

namespace :communications do
  namespace :monitor do
    desc 'Monitor and send communications for campaigns'
    task :erma => :environment do
      Rails.logger.info "-----BEGIN COMMUNICATION MONITORING-----"

      unsent_communications = Communication.all(:conditions => { :date_sent => nil})
      unsent_communications.each do |communication|
        Rails.logger.info "**sending communication**"
        communication.send if communication.time_to_send < Time.now
        Rails.logger.info "**communication sent**"
      end

      Rails.logger.info "-----END COMMUNICATION MONITORING-----"
    end #end erma task
  end #end sync namespace
end #end db namespace

然后您的 cron 工作将执行以下操作:

cd /path/to/application && rake communications:monitor RAILS_ENV=production

另外,我会考虑将您的加入模型的名称更改为更能描述其目的的名称,例如会员资格、活动有许多会员资格和联系人有许多会员资格。然后成员资格有一个 days_to_delay_communication 字段。

于 2010-05-15T16:23:44.067 回答
0

这样做的一个好方法是在您的联系人模型上使用“假”属性,如下所示:

class Contact < ActiveRecord::Base
  has_many :campaigncontacts
  has_many :campaigns, :through => :campaigncontacts

  attr_accessor :delay

  def delay #edit
    self.campaigncontacts.last.delaydays
  end

  def delay=(val)
    self.campaigncontacts.each do |c|
      c.delaydays = val
    end
  end
end

然后只需为这个假字段设置 in_place_editor :

in_place_edit_for :contact, :delay

<%= in_place_editor_field :contact, :delay %>

我不确定我是否完全理解您想要完成的工作,但我希望这至少可以为您指明正确的方向。

于 2010-05-10T02:56:51.810 回答