【问题标题】:Is save method mandatory in rails?轨道中的保存方法是强制性的吗?
【发布时间】:2019-07-30 08:11:24
【问题描述】:
Model.find(ids).each { |model| model.is_active = false } unless ids.empty?

这里,model.save 方法是否必要?因为没有它,它也可以工作。

列是这样定义的

t.integer :is_active, limit: 1

【问题讨论】:

  • 取决于is_active= 的实现方式。你说它在没有明确调用save 的情况下工作,所以is_active= 似乎会保留更改本身。
  • t.integer :is_active, 限制:1
  • 嗯,ActiveRecord 不会立即将更改持久化到模型中(这会导致无数数据库查询)。必须有其他事情发生,并且超出了您的上述代码。
  • tinyint 到 boolean 的转换有关系吗?

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


【解决方案1】:

您的问题的简短回答是:是的。

运行model.is_active = false 本身不会将更改保留在数据库中。运行model.is_active = false 后尝试重新获取数据库记录,您会看到该值实际上并没有改变;您还需要运行 model.save 来执行此操作。

但是,对于这样的场景(假设您想立即将更改保存到记录中!),有一种更简洁的方法来保存数据,而不是运行两个命令:

model.update_attribute(:is_active, false)

如果验证通过,这将更新数据库中的值,并运行任何回调(例如after_save)。

如果您想更新值而不运行验证和回调(这通常更快,但更“危险”),那么您可以改用:

model.update_column(:is_active, false)

【讨论】:

  • 是的,这些命令会起作用。我想知道我的代码是如何工作的。布尔到 tinyint 的转换是否有内部保存命令?
  • Tom 暗示了这一点,但这里有一个非常明确的例子:假设您是一名学生,并且您从学校获得了成绩单。然后,您小心地更改成绩单上的一个成绩以获得更好的成绩。您的成绩单已更新;但除非你偷偷溜进学校,把成绩单抄回官方登记簿,否则你的成绩不会改变。您的数据库模型是学校记录;您的变量内容是成绩单。只要您不重新加载,您就会拥有更新的副本;但是如果你请求一个新的(没有保存),你会得到“官方”记录。
猜你喜欢
  • 1970-01-01
  • 2020-07-05
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
相关资源
最近更新 更多