如何在使用Ruby on Rails 3的播种过程中避免验证,回调和'attr_accessible'效果?

use*_*052 2 database ruby-on-rails seed ruby-on-rails-3

我正在使用Ruby on Rails 3,我试图在我的应用程序数据库中播种数据.

在'RAILS_ROOT/models/user.rb'中我有:

class User < ActiveRecord::Base
  attr_accessible #none

  validates :name,
    :presence => true
  validates :surname,
    :presence => true
  validates :email,
    :presence => true
end
Run Code Online (Sandbox Code Playgroud)

在'RAILS_ROOT/db/seeds.rb'中我有:

# Test 1
User.find_or_create_by_email (
  :name       => "Test1 name",
  :surname    => "Test1 surname",
  :email      => "test1@test1.test1"
)

# Test2
User.find_or_create_by_email (
  :name       => "",
  :surname    => "",
  :email      => "test2@test2.test2"
)
Run Code Online (Sandbox Code Playgroud)

所以,在终端上运行

rake db:seed
Run Code Online (Sandbox Code Playgroud)

当然数据库不会填充数据,因为'attr_accessible'到nil(Case Test1)并且验证未通过(Case Test2).

我想在播种过程中跳过验证和"attr-accessible effects". 可能吗?如果是这样,怎么办?

PS:我不想在'RAILS_ROOT/db/migrate/201 .... rb'代码中使用这样的代码:

execute "INSERT INTO users ( name, surname, email ) VALUES ( "Test1 name", "Test1 surname", "test1@test1.test1")"
Run Code Online (Sandbox Code Playgroud)

UPDATE

我还需要跳过所有回调.可能吗?如果是这样,怎么样?

tom*_*rte 6

如果您查看ActiveRecord的文档,您将看到该attributes=方法有一个参数来启用它:

attributes=(new_attributes, guard_protected_attributes = true)

像这样使用它:

# Create a new user
@user = User.new

# Attributes for the user
@attrib = {
  :name       => "Test1 name",
  :surname    => "Test1 surname",
  :email      => "test1@test1.test1"
}

# Use 'send' to call the attributes= method on the object
@user.send :attributes=, @attrib, false

# Save the object
@user.save
Run Code Online (Sandbox Code Playgroud)

  • 我发现了一种方法可以跳过所有回调,验证和attr_accessible.它包括重新声明'seed.rb'文件中的ActiveRecord类,以便覆盖(这里我不确定)RoR应用程序中与该ActiveRecord相关的所有语句.示例:class User <ActiveRecord :: Base ... end.只需在'seed.rb'中添加该代码即可. (4认同)
  • 是啊.做`@user.send:create_without_callbacks`是否为`@ user.save` (2认同)
  • 抱歉,该方法仅适用于rails 2.还没有在轨道3上使用它,而且从我正在搜索它似乎它不可用. (2认同)