0

我对 Rails 方法中的执行顺序有疑问:这是我在模型中所做的:

def update_fields
  FillMethods.fill_info("BadgeUser", "Badge", self.id, self.badge_id, "badge_")
  self.reload
  self.update_attributes(:completed => true) if self.badge_goal == 0
end

我有一个对象,然后我在它上面应用 FillMethods 信息来填充这个对象中的一些字段并保存它。然后我想检查 badge_goal == 0 是否将其标记为已完成。

我遇到的问题是,如果我不放 self.reload,self 项将不会更新,对象将在数据库中,但 self 项将与 FillMethods 之前相同。如果我做 self.reload 自我项目是正确的,它可以被标记为正确完成

我的问题是红宝石会等待 FIllMethods 完成以重新加载自我,还是会在 FillMethods 完成之前重新加载自我?

如果我不执行 self.reload 为什么 self 项目不正确?FillMethods 是我的 lib 目录中的一个模块。

谢谢你的帮助,

那是我的填充方法:

模块填充方法

def self.fill_info(model1, model2, id1, id2, string)
  parameters1 = model1.constantize.attr_accessible[:default].to_a.map {|s| s.dup}
  parameters1.delete_if {|s| !s.start_with?(string)}
  parameters2 = parameters1.map {|s| s = s.split(string)[1]}

  h = Hash[parameters1.zip parameters2]
  object1 = model1.constantize.find(id1)
  object2 = model2.constantize.find(id2)

  h.each do |parameter1, parameter2|
    object1.update_attribute(parameter1.to_sym , object2.send(parameter2))
  end
    return object1
end

结尾

该方法的目标是用所有徽章信息填充 BadgeUser 表。对于我的 Badge 表中的每一列(如名称),我的 BadgeUser 表中都有 badge_name

谢谢,

4

1 回答 1

1

没有看到代码我无法确定,但是从你传递的参数来看,我猜 FillMethods.fill_info 使用第三个参数 id 再次从 db 中检索记录。然后它会更改记录并将其存储回来。

在 ActiveRecord 或类似的情况下,您的对象(自我)无法知道数据库以某种方式被修改。

请注意,您从 db 中检索相同的记录大约是三次而不是一次。

如果您将 FillMethods.fill_info 更改为接受记录(self 本身)并对其进行修改,则 self 将处于新状态。

附录

除非您明确启动一个新线程,否则 Ruby 代码将在单个线程中按顺序执行,所以是的,.fill_info在继续执行其余的 update_fields.

于 2013-05-03T14:14:48.167 回答