简体   繁体   中英

Rake db:seed NoMethodError: undefined method `sample'

I am trying to seed my database, but I am running into this error, and as a beginner do not know how to fix it. I'm trying to take a sample of bookmarks and assign them to some of my users. Any ideas why this is throwing an error? Here is the error:

vagrant@rails-dev-box:~/code/bookmarks$ rake db:seed
rake aborted!
NoMethodError: undefined method `sample' for #<Class:0xaa90cf4>
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.5/lib/active_record/dynamic_matchers.rb:22:in `method_missing'
/home/vagrant/code/bookmarks/db/seeds.rb:47:in `block (2 levels) in <top (required)>'
/home/vagrant/code/bookmarks/db/seeds.rb:46:in `times'
/home/vagrant/code/bookmarks/db/seeds.rb:46:in `block in <top (required)>'
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.5/lib/active_record/relation/delegation.rb:13:in `each'
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.5/lib/active_record/relation/delegation.rb:13:in `each'
/home/vagrant/code/bookmarks/db/seeds.rb:45:in `<top (required)>'
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.5/lib/active_support/dependencies.rb:223:in `load'
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.5/lib/active_support/dependencies.rb:223:in `block in load'
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.5/lib/active_support/dependencies.rb:214:in `load_dependency'
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/activesupport-4.0.5/lib/active_support/dependencies.rb:223:in `load'
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/railties-4.0.5/lib/rails/engine.rb:540:in `load_seed'
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.5/lib/active_record/tasks/database_tasks.rb:154:in `load_seed'
/home/vagrant/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.0.5/lib/active_record/railties/databases.rake:181:in `block (2 levels) in <top (required)>'
Tasks: TOP => db:seed

Edit: Here is my seeds.rb file:

require 'faker'

# Create a User
 # user = User.new(
 #   name:     'First Last',
 #   email:    'firstlast@gmail.com',
 #   password: 'password',
 # )
 # user.skip_confirmation!
 # user.save

#Create Users
5.times do
  user = User.new(
    name:     Faker::Name.name,
    email:    Faker::Internet.email,
    password: Faker::Lorem.characters(10)
  )
  user.skip_confirmation!
  user.save!
end
users = User.all


#Create Bookmarks
10.times do
  Bookmark.create!(
    url:    Faker::Internet.url
  )
end
bookmarks = Bookmark.all

#Create Topics
10.times do
  Topic.create!(
    name:   Faker::Lorem.sentence
  )
end
topics = Topic.all

users.each do |user|
  3.times do
    user.bookmarks << Bookmark.sample
  end
end

topics.each do |topic|
  3.times do
    user.topics << Topic.sample
 end
end

puts "Seed finished"
puts "#{User.count} users created"
puts "#{Bookmark.count} bookmarks created"
puts "#{Topic.count} topics created"

Thanks in advance for your help!

whereever you are calling .sample , the object before it is apparently not the correct type of object. It should either be an array or the 'collection' which results when you query your database. Like this...

posts = Post.all

posts.sample would work correctly

any object which is not an array (or like an array) will not have the 'sample' method available for you to use

You cannot call sample on a class as that is not a valid method. The sample method is used for arrays or ActiveRecord::Relation arrays.

For example, each of these would return a random

[0,1,2,3].sample

(0..10).to_a.sample

Post.all.sample

However, something like these examples would give an error.

User.sample

NoMethodError: undefined method 'sample' for #<Class:0x00000007faa378>

(9..199).sample

NoMethodError: undefined method 'sample' for 9..199:Range

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM