Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用has\u many:通过和就地编辑?_Ruby On Rails_Ruby_Has Many Through - Fatal编程技术网

Ruby on rails 如何使用has\u many:通过和就地编辑?

Ruby on rails 如何使用has\u many:通过和就地编辑?,ruby-on-rails,ruby,has-many-through,Ruby On Rails,Ruby,Has Many Through,我有两种模式:活动和联系 一场运动有很多联系人 一个联系人有很多活动 目前,每个联系人都有一个Contact.date\u entered属性。活动使用该日期作为ate,对属于该活动的不同事件进行倒计时 但是,在某些情况下,特定联系人的活动可能需要延迟X天。在本例中,activeContact.delaydays=10 在某些情况下,特定联系人的活动必须完全停止,因此现在我将ActivationContact.delaydays设置为1。(这有什么大问题吗?) 默认情况下,我假设不存在任何活动联

我有两种模式:活动和联系

一场运动有很多联系人

一个联系人有很多活动

目前,每个联系人都有一个Contact.date\u entered属性。活动使用该日期作为ate,对属于该活动的不同事件进行倒计时

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

在某些情况下,特定联系人的活动必须完全停止,因此现在我将ActivationContact.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_editor_field :campaigncontact, :delaydays %>


如何才能正确使用它?

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

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



我不确定我是否完全理解了您想要实现的目标,但我希望这至少为您指明了正确的方向。

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

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



我不确定我是否完全理解您想要实现的目标,但我希望这至少为您指明了正确的方向。

我会在您的活动联系人资源中添加一个名为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
然后,在应用程序的管理端,您可以拥有一个控制器和一个活动通信视图,该视图允许您按字段设置活动联系人的日期\至\延迟\通信\时间。如果你感兴趣的话,我可以为你进一步阐述,但我想你明白了

然后,您需要运行某种后台进程(可能是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

另外,我会考虑把你的连接模型的名字改为更详细的描述它的目的,例如会员资格,一个活动有很多会员资格,一个联系人有很多会员资格。然后,会员有一个天到延迟通信字段。

我想在您的活动联系人资源中添加一个名为天到延迟通信的整数字段,因为此信息与活动和联系人的关联有关,而不是与联系人本身有关

在您的迁移中:

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
然后,在应用程序的管理端,您可以拥有一个控制器和一个活动通信视图,该视图允许您按字段设置活动联系人的日期\至\延迟\通信\时间。如果你感兴趣的话,我可以为你进一步阐述,但我想你明白了

然后,您需要运行某种后台进程(可能是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

另外,我会考虑把你的连接模型的名字改为更详细的描述它的目的,例如会员资格,一个活动有很多会员资格,一个联系人有很多会员资格。然后一个成员有一个天到延迟通信字段。

Hi,我不得不将“”修改为“”,但没有显示任何内容,因为它是空的。我可以在这里默认一些字符吗?谢谢。嗨,我遇到了一个错误,上面写着:nil:NilClass的未定义方法“delaydays”。。。revery campaigncontact是否需要存在一个campaigncontacts实例?您好,我必须将“”修改为“”,但没有显示任何内容,因为它为NULL。我可以在这里默认一些字符吗?谢谢。嗨,我遇到了一个错误,上面写着:nil:NilClass的未定义方法“delaydays”。。。是否需要为Revirey campaigncontact创建一个campaigncontacts实例?是的……很有趣……我认为你是对的……我认为这是我需要消化它的方式……重新阅读本文,我如何做就地编辑……我会创建一个“假”吗联系人上的属性如其他人建议的那样?是的..很有趣…我认为你是对的..我认为这是我需要消化它的方式..重新阅读此内容,我如何做就地编辑器..我会像其他人建议的那样在联系人上创建“假”属性吗?