Как избежать проверки, обратных вызовов и эффектов attr_accessible во время процесса заполнения с использованием Ruby on Rails 3? - PullRequest
2 голосов
/ 29 января 2011

Я использую 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

В 'RAILS_ROOT / db / seed.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"
)

Итак, работает в Терминале

rake db:seed

конечно, база данных НЕ будет заполняться данными, потому что 'attr_accessible' в nil (Case Test1) и проверка не пройдена (Case Test2).

Я бы хотел пропустить валидацию и "доступные для атрибута эффекты" во время процесса посева. Возможно ли это? Если да, то как это сделать?

P.S .: Я не хочу использовать в коде 'RAILS_ROOT / db / migrate / 201 .... rb' вот так:

execute "INSERT INTO users ( name, surname, email ) VALUES ( "Test1 name", "Test1 surname", "test1@test1.test1")"

UPDATE

Мне нужно также пропустить все обратные вызовы . Возможно ли это? Если да, то как?

1 Ответ

6 голосов
/ 29 января 2011

Если вы посмотрите в документации 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

...