我有一个模型“ Section”。每当我尝试遍历Section对象(例如“ Section.all”或“ Section.create”)时,都会在Rails控制台中出现“(对象不支持#inspect)”错误,并出现“ NoMethodError(未定义方法`[]”)错误'代表nil:NilClass)”。
由于它已成为路障,所以我真的需要一些帮助。
Ruby:ruby 2.6.1p33
路轨:5.2.3
部分迁移
class CreateSections < ActiveRecord::Migration[5.2]
def change
create_table :sections do |t|
t.string :name
t.integer :students_count, :default => 0
t.references :class, index: true
t.references :class_teacher, index: true
t.timestamps
end
add_foreign_key :sections, :standards, column: :class_id
add_foreign_key :sections, :users, column: :class_teacher_id
end
end
部分模型
class Section < ApplicationRecord
belongs_to :class, :class_name => "Standard", :foreign_key => "standard_id"
belongs_to :class_teacher, :class_name => "User", :foreign_key => "class_teacher_id"
end
控制器代码
def index
@sections = Section.where(:class_id => params[:class_id])
render json: @sections
end
端子输出
NoMethodError (undefined method `[]' for nil:NilClass):
滚动控制台输入
Section.all
设置控制台输出
(Object doesn't support #inspect)
奇怪的是,当Section表为空时,控制台输出为
#<ActiveRecord::Relation []>
谢谢。
答案 0 :(得分:1)
除了@Tom Lord的评论,您还必须更正关联:
class Section < ApplicationRecord
belongs_to :class, class_name: "Standard"
belongs_to :class_teacher, class_name: "User"
end
由于您的迁移创建了class_id
和class_teacher_id
作为参考,因此正确的FK名称就是这些。
您需要在has_many模型上设置FK:
class Standard < ApplicationRecord
has_many :sections, foreign_key: :class_id
end
更新:
FK始终在 belongs_to 表上创建。由于您设置的关联名为class
,因此Rails希望表中存在名为class_id
的列,这就是为什么您不需要在{{1}中设置FK的原因}模型。
另一方面,Rails无法推断belongs_to
模型中的FK,因为它期望表has_many
上有一个名为standard_id
的列,但它名为{{ 1}},因此您需要手动设置正确的列名称。
希望有帮助。