Как избежать проверки, обратных вызовов и эффектов attr_accessible во время процесса заполнения с помощью 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

В «RAILS_ROOT/db/seeds.rb» у меня есть:

# Test 1
User.find_or_create_by_email (
  :name       => "Test1 name",
  :surname    => "Test1 surname",
  :email      => "[email protected]"
)

# Test2
User.find_or_create_by_email (
  :name       => "",
  :surname    => "",
  :email      => "[email protected]"
)

Итак, запуск в Терминале

rake db:seed

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

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

PS: я не хочу использовать в RAILS_ROOT/db/migrate/201....rb такой код:

execute "INSERT INTO users ( name, surname, email ) VALUES ( "Test1 name", "Test1 surname", "[email protected]")"

ОБНОВЛЕНИЕ

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


person user502052    schedule 29.01.2011    source источник


Ответы (1)


Если вы посмотрите документацию 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      => "[email protected]"
}

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

# Save the object
@user.save

person tomeduarte    schedule 29.01.2011
comment
Мне также нужно пропустить все обратные вызовы. Является ли это возможным? - person user502052; 29.01.2011
comment
Ага. Сделайте @user.send :create_without_callbacks вместо @user.save - person tomeduarte; 29.01.2011
comment
Извините, этот метод работает только на рельсах 2, по-видимому. Еще не использовал его на рельсах 3, и из того, что я ищу, кажется, что он недоступен. - person tomeduarte; 29.01.2011
comment
Я смотрю в Интернете, и я нашел все решения, которые не работают. Это: '@user.after_create.clear' (из blog.viarails.net/2009/1/29/) и что говорит @tomeduarte. Значит, мой сид невозможен?! - person user502052; 30.01.2011
comment
Я нашел подход, который пропускает все обратные вызовы, проверки и attr_accessible. Он состоит в повторном объявлении класса ActiveRecord в файле «seed.rb», чтобы переопределить (здесь я не уверен) все операторы в приложении RoR, связанные с этим ActiveRecord. Пример: класс User ‹ ActiveRecord::Base ... end. Просто добавьте этот код в «seed.rb». - person user502052; 30.01.2011
comment
Лучше всего, если вы опубликуете свое решение в качестве ответа и вместо этого примете его. - person tomeduarte; 30.01.2011
comment
@ user502052 спасибо, что поделились этим. В конце концов, это PORO, и вы также можете создать отношения, если вам нужно. Что-то вроде class User < ActiveRecord::Base; has_many :posts; end - person Kleber S.; 03.01.2014