1

キャンペーンと連絡先の 2 つのモデルがあります。

キャンペーンには多数の連絡先があります。

連絡先には、_多くのキャンペーンがあります。

現在、各連絡先には 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 ジョブ、またはdelayed_job プラグインを使用) を実行して、まだ発生していない通信を見つけ、日付が過ぎたときにそれらを発生させる必要があります。次のように 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

これを行う良い方法は、次のように Contact モデルで「偽の」属性を使用することです。

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 に答える