【问题标题】:Rails: .create nullifies a custom value for :idRails:.create 使 :id 的自定义值无效
【发布时间】:2012-06-30 02:24:33
【问题描述】:

当我执行 Model.create 方法时,如果我为 :id 指定一个值,它稍后会被取消。示例:

Model.create (
  :id => 50,
  :name => Joe,
  :enabled => yes
)

相反,我要做的是使用 .new 并将其存储在类变量中,通过类变量存储我的 id 值,然后最后调用保存:

m = Model.new (
  :name => Joe,
  :enabled => yes
)

m.id = 50
m.save

我正在尝试在种子.rb 中执行此代码,这不是非常干燥的代码。我怎样才能更好地做到这一点并获得相同的结果?

【问题讨论】:

  • 为什么需要这样做?它在 Rails 约定之外,所以确保它不会是 DRY(Rails “惩罚”你超出约定)。
  • 这甚至不是 Rails 约定的问题,而是关系数据库约定的问题。如果您依赖的主键在您的逻辑中具有某些值 (do_something if user.id == 50),您需要重新考虑您在做什么。

标签: ruby-on-rails ruby activerecord activemodel seed


【解决方案1】:

id 只是 attr_protected。为防止这种情况,您可以覆盖默认受保护属性的列表。在属性信息可能来自外部的任何地方都要小心。 id 字段默认受保护是有原因的。

class Model < ActiveRecord::Base
   private
   def attributes_protected_by_default
      []
   end
end

或与@Leo 一起回答

【讨论】:

  • 是的!谢谢,你今天教会了我一些新东西,这很有意义!同意,这是每个 RoR 开发人员在使用时应格外谨慎的内容。
【解决方案2】:

这可能是你的答案。 Model.create 基本上是一个 Model.new 后跟一个 Model.save ,因为您要更改 id 并再次保存,您不妨这样做

m = Model.new { 
  :name => Joe,
  :enabled => yes
}
m.id = 50
m.save!

这将使您免于进行两次保存。

【讨论】:

  • 我的错。我使用的是Model.new,但是对于我的问题,我的复制/粘贴速度太快了。对不起。我编辑了我原来的问题来纠正这个问题。
猜你喜欢
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 2011-01-22
相关资源
最近更新 更多