db迁移在ruby中插入一行

时间:2011-12-07 11:11:47

标签: ruby-on-rails ruby-on-rails-3 rake

我有一个包含用户名的文本文件。我想从文本文件中提取用户名,并通过db migrations将其插入到表中。这里提取部分工作正常。使用rake db没有显示错误:迁移。 但数据库中没有数据。

class AddUsers< ActiveRecord::Migration
   def self.up
     i=0
     File.open("users").each do |line|
     if i>=4 && line=~/^(\s)+[a-z]+/
         word=line.split("|")
         word[0]=word[0].strip
         email=word[0]+"\@sandvine.com"
         puts "word=#{word[0]},email=#{email}"
         User.create :name =>#{word[0]}, :email => #{email}
         puts "created"
     end
     i=i+1
   end
end

 u=User.create(:name => "ramyameena", :email  => "ramyameena@sandvine.com",:password=>"sandvine",:roles=>{:id=>2,:name=>"Tester"})
=> #<**User id: nil**, name: "ramyameena", created_at: nil, updated_at: nil, email: "ramyameena@sandvine.com", encrypted_password: "$2a$10$qIfRLKZlxviag9E0Gzvp8e3VKkOCaXraP7PnJC6vGMN....", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil>

irb(main):012:0> u.errors.inspect
=> "#<OrderedHash **{:roles=>[\"can't be blank\"]**}>"

我的用户型号:

class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates :name, :presence => true, :uniqueness => true
validates :roles, :presence => true
has_many :user_role_assignments
has_many :roles, :through => :user_role_assignments
has_many :tester_release_assignments
has_many :releases, :through => :tester_release_assignments
has_many :releases
has_many :ic_runs
accepts_nested_attributes_for :user_role_assignments
attr_accessible :email, :name, :password, :password_confirmation, :role_ids

感谢, 拉姆亚。

2 个答案:

答案 0 :(得分:1)

我不确定你要调用的create方法。之后的所有内容=&gt;将是一个评论。 应该是

User.create :name => word[0], :email => email

此外,最好将此代码添加到db/seeds.rb,而不是迁移,因为这是种子数据。

您可以使用rake db:seed

加载表格数据

答案 1 :(得分:1)

#{...}语法用于在字符串中插入ruby。你在这里正确使用它:

puts "word=#{word[0]},email=#{email}"

但在这里不正确:

User.create :name =>#{word[0]}, :email => #{email}

这里#实际上正在评论该行的其余部分(您甚至可以通过此处的语法突出显示)。很遗憾在运行此代码时不会出现任何语法错误,但最好结果是未定义的。你想要的是这个:

User.create(:name => word[0], :email => email)

正如@dexter alread所说。

顺便说一句,这是使用大括号的一个原因,即使你不必这样做,因为:

User.create(:name =>#{word[0]}, :email => #{email})

肯定会抛出语法错误,因为右括号被注释掉了。