Ruby on rails 在Rails中重写主键保护

Ruby on rails 在Rails中重写主键保护,ruby-on-rails,Ruby On Rails,在Rails中,有没有办法超越模型主键的质量分配保护? 因此无法加载我的seed.rb数据 更新 我发现在模型中包含以下代码会移除保护 def attributes_protected_by_default default = super default.delete self.class.primary_key default end 不理想使用属性直接赋值。您还可以利用块 Model.create! do |m| m.id = 27 m.attribute = "foo

在Rails中,有没有办法超越模型主键的质量分配保护? 因此无法加载我的seed.rb数据

更新

我发现在模型中包含以下代码会移除保护

def attributes_protected_by_default
  default = super
  default.delete self.class.primary_key
  default
end

不理想

使用属性直接赋值。您还可以利用块

Model.create! do |m|
  m.id = 27
  m.attribute = "foo"
end

很少需要直接触摸外键,例如

post = Post.create :title => "Lorem ipsum", :text => "dolor sit amet…"
comment = Comment.create :text => "Etiam mi mi, imperdiet a tempus suscipit…"
comment.post = post

为了播种而取消大规模分配保护是不明智的。Weppos建议使用直接分配,您对此表示:


不适合尝试创建大量记录的种子数据

使用直接赋值有什么不同?您可以迭代数组或数据散列,并用直接赋值填充它,就像将散列传递给构造函数一样简单。你并没有真的在存钱


另一种方法是直接使用原始SQL填充数据库,但种子设定并不是需要频繁运行的操作,因此必须对其进行优化。

我使用的是rails 3.1,上面的答案都不适用于我(使用传统的db模式)

不过,这是可行的:

class ActiveRecord::Base

  def self.no_pk_protection!
    # yikes
    default_scope :order => primary_key # this is necessary so first and last don't fail
    attr_accessor :mock_pk
    set_primary_key :mock_pk
  end

end
…然后:

class Category < ActiveRecord::Base

  no_pk_protection!

end
类别
不适用于尝试创建大量记录的种子数据。我在种子和测试中都使用FactoryGirl插件。它使用上述技术绕过任何质量分配限制。很好。。。我花了好几个小时才发现这一点。“为了播种而取消大规模分配保护是不明智的。”-是的,但当你想这么做时,它应该足够不可知,让你这么做。我忽略了对散列的迭代。Apols.但是当你需要的时候,你需要。只是看到了OP更新,这可能适用于rails 3.1没有检查