我正在使用 Rails 2,并且我在这个应用程序中的 Project
模型和 Schedule
模型之间存在一对多的关联。
当各种事物的属性发生变化时,我有一个观察者检查,作为响应,它迭代一个哈希数组,用它来填充新的 Schedule
实例。
每个 Schedule
实例都应该有一个属性 disp_order
,当在列表中显示它们时,它最终会告诉前端在哪里显示它。 disp_order
在将计划添加到项目时填充,因此它比当前最高的 disp_order
大 1。
问题出在观察者的迭代中。当我遍历填充有 Schedule
数据的哈希数组时,每次迭代都应将 disp_order
计算为比前一个高一个,以说明它刚刚添加的 Schedule
。但是,在实践中,它不会——除非我在迭代过程中使用 Project
刷新 project = Project.find(project.id)
对象,否则它似乎总是计算 disp_order
的相同最大值,并且没有准确的列表那些 Schedule
实例继续。
有一个更好的方法吗? (注意:我只是想说有没有更好的方法,这样我就不必告诉项目重新找到自己。有很多地方我正在积极清理后面的其余代码,但为此问题我真的只对这一行以及影响它的事情感兴趣。)
项目文件
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]
# ...
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", :section => "General"},
]
},
# More like this one.
]
接收其余 Action 数据的观察者方法
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
最佳答案
您遇到这个问题是因为您正在处理内存中的缓存对象。
看看 association documentation 。
您可以在 Schedule 模型的 add_to 函数中传递 true 参数以重新加载查询。
其他选项包括 inverse_of 但这对您不可用,因为您使用的是多态关联,根据文档。
关于ruby-on-rails - ActiveRecord 模型实例上的陈旧关联数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23689741/