【问题标题】:Rails could not find the inverse association in has many relationRails 在有很多关系中找不到反向关联
【发布时间】:2016-12-22 08:26:20
【问题描述】:

我在 rails 5 中有两个模型(它们之间的一对多关系), 一种是具有 Admin 命名空间的 ScholarshipGroup 和 Scholarship 模型。

奖学金组模式:

class Admin::ScholarshipGroup < ApplicationRecord    
  has_many :admin_scholarships, :class_name =>   'Admin::Scholarship',inverse_of: :admin_scholarship_group
end

和奖学金模式:

class Admin::Scholarship < ApplicationRecord
  belongs_to :group, :class_name=> 'Admin::ScholarshipGroup',   inverse_of: 'admin_scholarships'      
end

我想要获得 ScholarshipGroup 下所有奖学金的数据。 但是当我从 rails 控制台运行这个查询时:

$ Admin::ScholarshipGroup.first.admin_scholarships.first

但它给了我这个错误:

Admin::ScholarshipGroup Load (0.3ms)  SELECT  "admin_scholarship_groups".* FROM "admin_scholarship_groups" ORDER BY "admin_scholarship_groups"."id" ASC LIMIT ?  [["LIMIT", 1]]
ActiveRecord::InverseOfAssociationNotFoundError: Could not find the inverse association for admin_scholarships (:admin_scholarship_group in Admin::Scholarship)
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activerecord-5.0.0.1/lib/active_record/reflection.rb:202:in `check_validity_of_inverse!'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activerecord-5.0.0.1/lib/active_record/reflection.rb:402:in `check_validity!'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activerecord-5.0.0.1/lib/active_record/associations/association.rb:25:in `initialize'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activerecord-5.0.0.1/lib/active_record/associations.rb:235:in `new'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activerecord-5.0.0.1/lib/active_record/associations.rb:235:in `association'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activerecord-5.0.0.1/lib/active_record/associations/builder/association.rb:111:in `admin_scholarships'
        from (irb):34
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/railties-5.0.0.1/lib/rails/commands/console.rb:65:in `start'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/railties-5.0.0.1/lib/rails/commands/console_helper.rb:9:in `start'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/railties-5.0.0.1/lib/rails/commands.rb:18:in `<top (required)>'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `block in require'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require'
        from /home/ubuntu/workspace/bin/rails:9:in `<top (required)>'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `block in load'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
        from /usr/local/rvm/gems/ruby-2.3.1@college/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load'
        from /usr/local/rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from -e:1:in `<main>'

为什么会返回这种类型的错误?谁能建议我解决这个错误?

【问题讨论】:

    标签: ruby ruby-on-rails-4 one-to-many has-many


    【解决方案1】:

    您在Admin::Scholarship 模型中定义了belongs_to :group

    你可以试试:

    has_many :admin_scholarships, :class_name => 'Admin::Scholarship',inverse_of: :group, foreign_key: 'group_id'
    

    【讨论】:

    • 我已经进行了更改,但现在它显示了这个错误:` Admin::ScholarshipGroup Load (0.5ms) SELECT "admin_scholarship_groups".* FROM "admin_scholarship_groups" ORDER BY "admin_scholarship_groups"."id" ASC限制 ? [["LIMIT", 1]] Admin::Scholarship Load (0.7ms) SELECT "admin_scholarships".* FROM "admin_scholarships" WHERE "admin_scholarships"."scholarship_group_id" = ? ORDER BY "admin_scholarships"."id" ASC LIMIT ? [["scholarship_group_id", 1], ["LIMIT", 1]] `
    • 这个错误:ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: admin_scholarships.scholarship_group_id
    • 您能出示您的schema.rb 文件吗?也许您使用了不同的外键名称。
    • create_table "admin_scholarship_groups", force: :cascade do |t| t.string "name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "admin_scholarships", force: :cascade do |t| t.string "name" t.integer "discount" t.string "condition" t.text "details" t.integer "group_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["group_id"], name: "index_admin_scholarships_on_group_id" end
    • @Engr.TanbirHasan 我明白了,请查看我更新的答案。您需要在关联中添加foreign_key: 'group_id'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多