Я бы добавил целочисленное поле к вашему ресурсу Campaigncontacts под названием days_to_delay_communication_by, поскольку эта информация относится к ассоциации кампании и контакта, а не самого контакта.
в вашей миграции:
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 для CampaignContacts. Я могу рассказать вам об этом подробнее, если вам интересно, но я думаю, вы поняли идею.
Затем вам нужно будет запустить некоторый фоновый процесс (возможно, задание cron или использовать плагин delayed_job ), чтобы найти сообщения, которые еще не произошли, и заставить их произойти, когда дата прошла. Вы можете сделать это в граблях, например так:
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.