Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.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 ActiveRecord模型实例上的过时关联数据?_Ruby On Rails_Ruby_Activerecord_Ruby On Rails 2 - Fatal编程技术网

Ruby on rails ActiveRecord模型实例上的过时关联数据?

Ruby on rails ActiveRecord模型实例上的过时关联数据?,ruby-on-rails,ruby,activerecord,ruby-on-rails-2,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 2,我使用的是Rails 2,在这个应用程序中,项目模型和计划模型之间有一对多的关联 当各种事物的属性发生变化时,我有一个观察者检查,作为响应,它迭代一个散列数组,用它填充新的Schedule实例 每个计划实例都应该有一个属性,disp_order,当在列表中显示它们时,它最终会告诉前端在哪里显示它。将计划添加到项目中时,将填充disp_顺序,使其比当前最高的disp_顺序多一个 问题在于观测器中的迭代。当我迭代填充了Schedule数据的散列数组时,每次迭代都应计算disp_顺序,使其比上一次高出

我使用的是Rails 2,在这个应用程序中,
项目
模型和
计划
模型之间有一对多的关联

当各种事物的属性发生变化时,我有一个观察者检查,作为响应,它迭代一个散列数组,用它填充新的
Schedule
实例

每个
计划
实例都应该有一个属性,
disp_order
,当在列表中显示它们时,它最终会告诉前端在哪里显示它。将计划添加到项目中时,将填充
disp_顺序
,使其比当前最高的
disp_顺序
多一个

问题在于观测器中的迭代。当我迭代填充了
Schedule
数据的散列数组时,每次迭代都应计算
disp_顺序,使其比上一次高出一个,以说明它刚刚添加的
Schedule
。但是,在实践中,它不——除非我在迭代过程中用<代码> Projt= Projject .find(Proj.ID)< /C> >刷新,否则它似乎总是计算<代码> DISSCORDEXON/<代码>的相同MAX值,并且没有一个准确的“<代码>调度< /代码>实例继续下去的列表”。 有更好的方法吗?(注意:我的意思是,有没有更好的方法,这样我就不必告诉project重新发现自己了。我正在积极清理下面的代码的其余部分,但对于这个问题,我只对这一行和影响它的事情感兴趣。)

project.rb 接收其余动作数据的观察者方法 附表1.rb
您遇到此问题是因为您正在使用内存中的缓存对象

请看下面的图片

您可以在调度模型的add_to函数中传递参数true以重新加载查询


其他选项包括反向链接,但这不适用于您,因为您正在使用多态关联,如文档所示

一个控制台示例演示您的问题会很有帮助。
class Project < ActiveRecord::Base
  # ...
  has_many :schedules, :dependent => :destroy
  # ...
  belongs_to :data, :polymorphic => true, :dependent => :destroy
    accepts_nested_attributes_for :data
  # ...
class Schedule < ActiveRecord::Base
  belongs_to :project, :include => [:data]
  # ...
class ProjectEventObserver < ActiveRecord::Observer
  # ...          
  def perform_actions(project, actions)
    # ...
    actions.each { |action|
      action.each { |a_type, action_list|
        action_list.each { |action_data|
          self.send(action_type.to_s.singularize, action_data, project)
          project = Project.find(project.id) #My question is about this line.
        }
      }
    }
  # ...
[    
  {:add_tasks => [
    {:name => "Do a thing", :section => "General"},
    {:name => "Do another thing", :section => "General"},
   ]
  },
  # More like this one.
]
def add_task(hash, project)
  # ...
  sched = Schedule.new
  hash.each { |key, val|
    # ...
    sched.write_attribute(key, val)
    # ...
  }
  sched.add_to(project)
end
def add_to(proj)
  schedules = proj.schedules
  return if schedules.map(&:name).include?(self.name)
  section_tasks = schedules.select{|sched| sched.section == self.section}
  if section_tasks.empty?
    self.disp_order = 1
  else
    self.disp_order = section_tasks.map(&:disp_order).max + 1 #always display after previously existing schedules
  end
  self.project = proj
  self.save
end