Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:.create将:id的自定义值设置为空_Ruby On Rails_Ruby_Activerecord_Activemodel_Seed - Fatal编程技术网

Ruby on rails Rails:.create将:id的自定义值设置为空

Ruby on rails Rails:.create将:id的自定义值设置为空,ruby-on-rails,ruby,activerecord,activemodel,seed,Ruby On Rails,Ruby,Activerecord,Activemodel,Seed,当我执行Model.create方法时,如果我为:id指定了一个值,它稍后将被置为空。例如: Model.create ( :id => 50, :name => Joe, :enabled => yes ) 相反,我要做的是使用.new并将其存储在类变量中,通过类变量存储我的id值,然后最后调用save: m = Model.new ( :name => Joe, :enabled => yes ) m.id = 50 m.save 我试

当我执行Model.create方法时,如果我为:id指定了一个值,它稍后将被置为空。例如:

Model.create (
  :id => 50,
  :name => Joe,
  :enabled => yes
)
相反,我要做的是使用.new并将其存储在类变量中,通过类变量存储我的id值,然后最后调用save:

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

m.id = 50
m.save

我试图在seeds.rb中执行这段代码,这段代码不是很枯燥。我如何才能做得更好并达到同样的效果?

这可能是您的答案。Model.create基本上是一个Model.new,后跟一个Model.save,既然您正在更改id并再次保存,那么您也可以这样做

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

这样你就不用做两次扑救了

id仅受属性保护。要防止出现这种情况,可以覆盖默认受保护属性的列表。在属性信息可能来自外部的任何地方执行此操作时都要小心。由于某种原因,id字段被默认保护

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

或者选择@Leo answer

你为什么需要这样做?这超出了Rails的惯例,所以要确保它不会干涸(Rails会因为你超出惯例而“惩罚”你)。这甚至不是Rails惯例的问题,而是关系数据库惯例的问题。如果您依赖于在逻辑中具有特定值的主键(
如果user.id==50,请执行某些操作),您需要重新考虑您正在执行的操作。我的错。我使用的是
模型。new
,但我的问题复制/粘贴速度太快。很抱歉我编辑了我的原始问题以更正此问题。是的!谢谢,你今天教了我一些新东西,这很有意义!同意,这是每个RoR开发人员在使用时应该格外小心的事情。