2

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      => "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)ため、データベースにはデータが入力されません。

シードプロセス中の検証と「attr-accessibleエフェクト」をスキップしたいと思います。 出来ますか?もしそうなら、それを行う方法は?

PS:次のような「RAILS_ROOT / db / migrate / 201....rb」コードでは使用したくありません。

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

アップデート

また、すべてのコールバックをスキップする必要があります。出来ますか?もしそうなら、どのように?

4

1 に答える 1

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

于 2011-01-29T18:59:26.917 に答える