How to avoid the validation, callbacks and 'attr_accessible' effects during the seeding process using Ruby on Rails 3?

淺唱寂寞╮ 提交于 2019-12-03 20:31:27

问题


I am using Ruby on Rails 3 and I am trying to seed data in my application database.

In 'RAILS_ROOT/models/user.rb' I have:

class User < ActiveRecord::Base
  attr_accessible #none

  validates :name,
    :presence => true
  validates :surname,
    :presence => true
  validates :email,
    :presence => true
end

In 'RAILS_ROOT/db/seeds.rb' I have:

# 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"
)

So, running in the Terminal

rake db:seed

of course the database will NOT populate with datas because 'attr_accessible' to nil (Case Test1) and validation not passed (Case Test2).

I would like to skip the validation and "attr-accessible effects" during the seeding process. Is it possible? If so, how to do that?

P.S.: I don't want to use in 'RAILS_ROOT/db/migrate/201....rb' code like this:

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

UPDATE

I need also to skip all callbacks. Is it possible? If so, how?


回答1:


If you check ActiveRecord's documentation you'll see the attributes= method has a parameter to enable this:

attributes=(new_attributes, guard_protected_attributes = true)

Use it like this:

# 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



来源:https://stackoverflow.com/questions/4838716/how-to-avoid-the-validation-callbacks-and-attr-accessible-effects-during-the

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!