首页 > 解决方案 > 设置具有相同值的 Rails 模型属性会改变吗?返回真?

问题描述

我希望通过允许根据 in 的值和后端数据库的当前状态db:seed创建或更新应用程序中的某些条目(或根本不更新)来使我的任务更加动态。db/seeds.rb我还希望简化执行此逻辑的功能。

我想避免这种情况:

def create_or_update_config(key, value)

  ...

  if config_entry.value != value
    config_entry.value
  end

  if config_entry.changed?
    config_entry.save
  end

  ...

end

而是有一些简单的东西:

def create_or_update_config(key, value)

  ...

  config_entry.value = value

  if config_entry.changed?
    config_entry.save
  end

  ...

end

ActiveRecord 是否足够聪明,可以知道属性值是否已更改,即使它们已被设置(具有相同的值)?

标签: ruby-on-railsactiverecordseeding

解决方案


是的。ActiveRecord 的changed?方法只有在上次保存后发生突变时才会返回 true。从使用我自己的应用程序控制台(Rails 5.1.6)的示例中:

irb(main):013:0> config.value
=> "http://localhost:3100"
irb(main):014:0> config.value = "http://localhost:3100"
=> "http://localhost:3100"
irb(main):015:0> config.changed?
=> false
irb(main):016:0> config.value = "anything else"
=> "anything else"
irb(main):017:0> config.changed?
=> true

推荐阅读