加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – ActiveRecord模型实例上陈旧的关联数据?

发布时间:2020-12-17 02:22:35 所属栏目:百科 来源:网络整理
导读:我正在使用Rails 2,我在这个应用程序中的Project模型和Schedule模型之间有一对多的关联. 我有一个观察者检查各种事物的属性是否发生变化,作为响应,它会迭代一组哈希值,用于填充新的Schedule实例. 每个Schedule实例都应该有一个属性disp_order,它最终告诉前端
我正在使用Rails 2,我在这个应用程序中的Project模型和Schedule模型之间有一对多的关联.

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

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

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

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

project.rb

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

schedule.rb

class Schedule < ActiveRecord::Base
  belongs_to :project,:include => [:data]
  # ...

project_event_observer.rb

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",]
  },# 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

schedule.rb

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

解决方法

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

看看association documentation.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读