ActiveRecord模型实例上陈旧的关联数据?

时间:2014-05-15 22:27:49

标签: ruby-on-rails ruby activerecord ruby-on-rails-2

我正在使用Rails 2,我在此应用中的Project模型和Schedule模型之间存在一对多的关联。

我有一个观察者检查各种事物的属性是否发生变化,作为回应,它会迭代一组哈希值,用以填充新的Schedule个实例。

每个Schedule实例都应该有一个属性disp_order,最终告诉前端在列表中显示它们时显示它的位置。在将计划添加到项目时填充disp_order,使其等于当前最高disp_order的一个。

问题在于观察者的迭代。当我遍历填充了Schedule数据的哈希数组时,每次迭代都应该将disp_order计算为比前一个更高的一个,以考虑它刚刚添加的Schedule 。但是,在实践中,它不会 - 除非我使用Project在迭代过程中刷新project = Project.find(project.id)对象,否则似乎总是计算{{1}的相同最大值s,并且没有准确的disp_order个实例列表。

有更好的方法吗? (注意:我只是说有更好的方法,所以我不必告诉项目重新找到自己。有很多地方我正在积极清理后面的其余代码,但为此问题我真的只对这一行和影响它的事情感兴趣。)

project.rb

Schedule

schedule.rb

class Project < ActiveRecord::Base
  # ...
  has_many :schedules, :dependent => :destroy
  # ...
  belongs_to :data, :polymorphic => true, :dependent => :destroy
    accepts_nested_attributes_for :data
  # ...

project_event_observer.rb

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.
]

schedule.rb

def add_task(hash, project)
  # ...
  sched = Schedule.new
  hash.each { |key, val|
    # ...
    sched.write_attribute(key, val)
    # ...
  }
  sched.add_to(project)
end

1 个答案:

答案 0 :(得分:3)

您正在遇到此问题,因为您正在处理内存中的缓存对象。

查看association documentation

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

其他选项包括inverse_of,但是您无法使用这些选项,因为您根据文档使用了多态关联。