Rails - 从数据库会话中分离模型

时间:2018-03-02 03:28:50

标签: ruby-on-rails ruby-on-rails-4

我遇到了一个场景,在其他语言中我会将模型对象从事务中分离出来然后我可以改变它我想要的所有内容而不用担心自动更新记录。

问题

  1. rails不支持附加\分离模型对象吗?

  2. 有什么替代方案,只需复制对象?

  3. 修改

    方案

    我们正在从数据库中读取模型,我们希望对它们进行更改,这些更改将在事务结束时不会持久保存到数据库中。在Hibernate \ JPA等中,您可以分离模型(实体),并且不会保留任何更改。

    现在您可能会问为什么不使用Model.dup?答案是我们仍然需要模型的id,但是一旦你分配了id,rails就会认为这个实例现在是模型并在事务结束时更新记录。

    由于

2 个答案:

答案 0 :(得分:2)

您可以完全更改Rails模型实例属性,而无需保留更改。

有一个couple of methods to change model attributes,其中一些会自动将更改自动保存到数据库中,而其他一些只是更改内存中实例的属性值。

您可以尝试使用上面列表中的#assign_attributes#<attribute>=。 只有在事后明确调用#save之后,更改才会保存到数据库中。

答案 1 :(得分:0)

如前一个答案所述,您可以更新实例属性而不会将其保留(例如,避免self.save)。但是如果你想确定,请考虑以下使用验证来检查标志属性为nil(或空白):

attr_accessor :prevent_save
validates :prevent_save, absence: true

def prevent_save!
  self.prevent_save = true
end

def do_something_safely

  prevent_save!

  self.other_attr = 'abc'

end

def accidentally_save
  # if prevent_save! has been previously called, 
  # validations will fail, and save! will raise an exception
  self.save!
end