【发布时间】:2021-12-13 02:54:46
【问题描述】:
我的问题
我正在尝试通过我的 Ruby on Rails 应用程序中的外键关联检索数据。主表中的数据已正确加载,但关联对象未加载且始终为nil。
背景信息(迁移、数据库表和模型类)
我目前正在处理两个表:
- eval_forms
- user_details
这些表是通过 Rails 迁移创建的。
user_details 表是通过单次迁移创建的:
class CreateUserDetails < ActiveRecord::Migration[5.2]
def change
create_table :user_details do |t|
t.string :eduPersonPrincipalName, unique: true
t.string :DisplayName, default: 'NULL'
t.string :Email, default: 'NULL'
t.string :Role, default: 'Student'
t.boolean :hasAppointment, default: '0'
t.timestamps
end
end
def self.down
drop_table :user_details
end
end
并且 eval_forms 表已经进行了一些迁移来创建和更新它:
class CreateEvalForms < ActiveRecord::Migration[6.1]
def change
create_table :eval_forms do |t|
t.belongs_to :form_builder, foreign_key: 'form_builder_id'
t.belongs_to :course, foreign_key: 'course_id'
t.string :Description
t.datetime :OpenDate
t.datetime :CloseDate
t.timestamps
end
end
end
class UpdateEvalForms < ActiveRecord::Migration[6.1]
def change
add_column :eval_forms, "Author_user_details_id", :bigint, null: false
add_foreign_key :eval_forms, :user_details, column: "Author_user_details_id"
add_column :eval_forms, "Year", :integer
add_column :eval_forms, "Semester", :string
add_column :eval_forms, "IsArchived", :boolean
end
end
我知道外键设置正确,因为它在 MySQL 中正确列出。以下是来自 MySQL 的 2 个表及其关系的参考:
另外,我已经在我的 Rails 应用程序中设置了模型类。
eval_form:
class EvalForm < ApplicationRecord
has_many :eval_forms_roles
has_many :roles, through: :eval_forms_roles
has_many :eval_forms_courses
has_many :courses, through: :eval_forms_courses
has_many :eval_responses
has_many :eval_reminders
belongs_to :user_detail
validates :formName, presence: true
validates :formData, presence: true
end
用户详细信息:
class UserDetail < ApplicationRecord
has_one :la_detail
has_many :eval_responses
has_many :eval_forms
end
那么怎么了?
最后,这里是从数据库中检索对象的代码以及出现错误的部分。
我的控制器操作:
def index
# list *all* existing evaluation forms, with options to filter by OpenDate, CloseDate, etc (todo)
@EvalForms = EvalForm.includes(:user_detail)
end
我的看法:
<td><%= ef.user_detail.DisplayName %></td>
我的错误:
NoMethodError in Evaluations::EvalForms#index
undefined method `DisplayName' for nil:NilClass
提取源位置:<td><%= ef.user_detail.DisplayName %></td>
重述问题
总之,尽管我在控制器操作中使用了 .includes() 语句,但为什么没有检索到关联的 user_detail 对象,我真的很困惑。我对 Ruby 和 Rails 都很陌生,但是应用程序中的其他部分看起来与此类似并且可以正常工作,所以我看不出我的问题是什么。
【问题讨论】:
-
您需要告诉协会这种关系是非常规的,例如
belongs_to :user_detail应该是belongs_to :user_detail, foreign_key: :another_user_details_id(同样需要在UserDetail中的has_many上应用) -
你到底为什么要
t.string :DisplayName, default: 'NULL'?这会将默认值设置为字符串'NULL'而不是实际的 null/nil,这将搞砸 Ruby 中的任何 WHERE IS NULL 查询和真值检查。 -
@engineersmnky 谢谢,就是这样!
-
@max 不知道,我和我的团队继承了这个项目
标签: mysql ruby-on-rails ruby