【问题标题】:seeding a db in ruby on rails, can't initialize a object because of a method missing I don't use在 ruby​​ on rails 中播种数据库,由于缺少我不使用的方法而无法初始化对象
【发布时间】:2016-06-18 18:32:08
【问题描述】:

我有一个模型,其中包含用户拥有并属于许多品牌,这些品牌拥有许多产品和许多类别。代码:

class User < ActiveRecord::Base
  has_and_belongs_to_many :brands, dependent: :destroy
  accepts_nested_attributes_for :brands
  validates_presence_of :brands
end

class Brand < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_many :products, dependent: :destroy

  validates :name,  presence: true,
                    length: { maximum: 50 }
end

class Product < ActiveRecord::Base
  belongs_to :brand
  has_many :categories, dependent: :destroy

  validates :price,    presence: true
  validates :brand_id, presence: true
  validates :name,     presence: true,
                       length: { maximum: 50 }
end

class Category < ActiveRecord::Base
  belongs_to :product

  validates :product_id, presence: true
  validates :name,       presence: true,
                         length: { maximum: 50 }
end

架构:

ActiveRecord::Schema.define(version: 20160617235015) do

  create_table "brands", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "brands_users", id: false, force: :cascade do |t|
    t.integer "brand_id"
    t.integer "user_id"
  end

  add_index "brands_users", ["brand_id"], name: "index_brands_users_on_brand_id"
  add_index "brands_users", ["user_id"], name: "index_brands_users_on_user_id"

  create_table "categories", force: :cascade do |t|
    t.string   "name"
    t.decimal  "price"
    t.boolean  "out_of_stock", default: false
    t.integer  "product_id"
    t.datetime "created_at",                   null: false
    t.datetime "updated_at",                   null: false
  end

  add_index "categories", ["product_id"], name: "index_categories_on_product_id"

  create_table "products", force: :cascade do |t|
    t.string   "name"
    t.integer  "brand_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_index "products", ["brand_id"], name: "index_products_on_brand_id"

  create_table "users", force: :cascade do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at",                        null: false
    t.datetime "updated_at",                        null: false
    t.string   "password_digest"
    t.string   "remember_digest"
    t.boolean  "admin",             default: false
    t.string   "activation_digest"
    t.boolean  "activated",         default: false
    t.datetime "activated_at"
    t.string   "reset_digest"
    t.datetime "reset_sent_at"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true

end

品牌和用户部分工作正常,是我代码的先前实现。当我尝试使用 rake db:seed 为我的数据库播种时:

User.create!(name: "Foobar",
             email: "foobar@foobar.com",
             password: 'foobarbaz',
             password_confirmation: 'foobarbaz',
             admin: true,
             activated: true,
             activated_at: Time.zone.now,
             brands_attributes: [name: 'Bar'])

User.create!(name: "Foo",
            email: "foo@bar.com",
            password: 'foobarbaz',
            password_confirmation: 'foobarbaz',
            admin: false,
            activated: true,
            activated_at: Time.zone.now,
            brands_attributes: [name: 'Foo'])

brand = Brand.second
15.times do
  name = Faker::Commerce.product_name
  brand.products.create!(name: name)
end

products = Product.take(10)
3.times do
  name = Faker::Space.star
  price = 1
  products.each { |product| product.categories.create!(name:  name,
                                                       price: price) }
end

50.times do |n|
  name = Faker::Name.name
  email = "example-#{n+1}@foobar.org"
  password = "password"
  brand = Faker::Company.name
  User.create!(name: name,
               email: email,
               password: password,
               password_confirmation: password,
               activated: true,
               activated_at: Time.zone.now,
               brands_attributes: [name: brand])
end

我收到此错误:

rake aborted!
NoMethodError: undefined method `price' for #<Product:0x007ff77baa7b50>
<path>/.rvm/gems/ruby-2.3.1/gems/activemodel-4.2.6/lib/active_model/attribute_methods.rb:433:in `method_missing'
<path>/.rvm/gems/ruby-2.3.1/gems/activemodel-4.2.6/lib/active_model/validator.rb:149:in `block in validate'
<path>/.rvm/gems/ruby-2.3.1/gems/activemodel-4.2.6/lib/active_model/validator.rb:148:in `each'
<path>/.rvm/gems/ruby-2.3.1/gems/activemodel-4.2.6/lib/active_model/validator.rb:148:in `validate'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/validations/presence.rb:5:in `validate'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:455:in `public_send'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:455:in `block in make_lambda'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:192:in `block in simple'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:504:in `block in call'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:504:in `each'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:504:in `call'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:92:in `__run_callbacks__'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:778:in `_run_validate_callbacks'
<path>/.rvm/gems/ruby-2.3.1/gems/activemodel-4.2.6/lib/active_model/validations.rb:399:in `run_validations!'
<path>/.rvm/gems/ruby-2.3.1/gems/activemodel-4.2.6/lib/active_model/validations/callbacks.rb:113:in `block in run_validations!'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:88:in `__run_callbacks__'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:778:in `_run_validation_callbacks'
<path>/.rvm/gems/ruby-2.3.1/gems/activemodel-4.2.6/lib/active_model/validations/callbacks.rb:113:in `run_validations!'
<path>/.rvm/gems/ruby-2.3.1/gems/activemodel-4.2.6/lib/active_model/validations.rb:338:in `valid?'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/validations.rb:58:in `valid?'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/validations.rb:83:in `perform_validations'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/validations.rb:43:in `save!'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/attribute_methods/dirty.rb:29:in `save!'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/transactions.rb:291:in `block in save!'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/transactions.rb:351:in `block in with_transaction_returning_status'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/database_statements.rb:211:in `transaction'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/transactions.rb:220:in `transaction'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/transactions.rb:348:in `with_transaction_returning_status'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/transactions.rb:291:in `save!'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/has_many_association.rb:39:in `insert_record'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/collection_association.rb:495:in `block (2 levels) in _create_record'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/collection_association.rb:408:in `replace_on_target'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/collection_association.rb:403:in `add_to_target'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/collection_association.rb:493:in `block in _create_record'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/collection_association.rb:183:in `block in transaction'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/transaction.rb:184:in `within_new_transaction'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/transactions.rb:220:in `transaction'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/collection_association.rb:182:in `transaction'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/collection_association.rb:492:in `_create_record'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/has_many_association.rb:187:in `_create_record'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/collection_association.rb:157:in `create!'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/associations/collection_proxy.rb:306:in `create!'
<path>/seeds.rb:22:in `block in <top (required)>'
<path>/seeds.rb:20:in `times'
<path>/seeds.rb:20:in `<top (required)>'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `block in load'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'
<path>/.rvm/gems/ruby-2.3.1/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load'
<path>/.rvm/gems/ruby-2.3.1/gems/railties-4.2.6/lib/rails/engine.rb:547:in `load_seed'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/tasks/database_tasks.rb:250:in `load_seed'
<path>/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.6/lib/active_record/railties/databases.rake:183:in `block (2 levels) in <top (required)>'
<path>/.rvm/gems/ruby-2.3.1/bin/ruby_executable_hooks:15:in `eval'
<path>/.rvm/gems/ruby-2.3.1/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => db:seed

我尝试了很多,但我找不到任何错误或解决方案。除了类别中的列,我不在任何地方使用价格。 作为初学者,任何帮助都会有所帮助。

【问题讨论】:

    标签: ruby-on-rails database activerecord


    【解决方案1】:

    由于对您的产品模型进行了以下验证,您很可能会收到此错误:

     validates :price,    presence: true
    

    尝试删除它。

    【讨论】:

    • 天哪,你是我的英雄!不敢相信!该验证应该在类别中!我搞砸了!
    • 谢谢。好吧,那我想你应该接受我的回答。
    【解决方案2】:

    您的架构没有显示价格。这就是为什么它给你undefined methodprice'`

    create_table "products", force: :cascade do |t|
            t.string   "name"
            t.integer  "brand_id"
            t.datetime "created_at", null: false
            t.datetime "updated_at", null: false
          end
    

    【讨论】:

    • 是的,我在产品中没有价格。我只希望它在类别中。这就是为什么我不明白为什么它调用产品中缺少的方法。我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多