Ruby on Rails - ActiveRecord 关联问题:查询未正确进行(单数与复数?)
Posted
技术标签:
【中文标题】Ruby on Rails - ActiveRecord 关联问题:查询未正确进行(单数与复数?)【英文标题】:Ruby on Rails - ActiveRecord Association Issues : Queries Not Being Made Properly (singular vs. plural?) 【发布时间】:2018-02-20 21:22:59 【问题描述】:我觉得我必须在这里发的第一篇文章,通常我的问题只是通过阅读其他帖子来回答,但这次我认为我太深了,找不到正确的答案,我一直在寻找一会儿。我的代码中可能存在多个问题。
我是 RoR 的新手,最近几个月才开始使用它。我正在尝试运行测试查询以确保我的关联正常工作,并且根据我得到的错误,我觉得我搞砸了一些简单的事情。我正在为 web 应用程序设置几个表,我现在将专注于 2 个表,因为以后可以在其他地方应用对此的修复。
相关信息:
-我正在使用 Devise 进行用户身份验证
-我有一个 pto_requests_controller.rb 和 registrations_controller.rb(注册与设计一起用作用户控制器)
-在数据库中,表名是'users'和'pto_requests'
我有一个 pto_request 模型(文件名为“pto_request.rb”):
class PtoRequest < ApplicationRecord
belongs_to :user, optional: true
end
还有一个用户模型(文件名为'user.rb'):
class User < ApplicationRecord
has_many :pto_requests
end
为了在数据库中创建关联,我使用了这个迁移:
class AddUsersToPtorequests < ActiveRecord::Migration[5.1]
def change
add_reference :pto_requests, :users, foreign_key: true
end
end
外键是在“pto_requests”表中创建的,名为“users_id”
我可以毫无问题地单独查询表,但是一旦我尝试通过 pto_requests 访问诸如 user.fname 之类的数据,它就会出错。作为我尝试过的示例查询:
<%= PtoRequest.joins(:user)
.select('user.fname as user_name').first.user_name%>
我收到以下错误:
mysql2::Error: Unknown column 'user.fname' in 'field list': SELECT user.fname >as user_name FROM
pto_requests
INNER JOINusers
ONusers
.id
= >pto_requests
.user_id
ORDER BYpto_requests
.id
ASC 限制 1
我目前的理论是它与生成的 SQL 语法末尾的问题有关,因为它正在寻找“user_id”,但这不存在,只有“users_id”存在。非常感谢任何帮助,如果需要更多信息,请告诉我。
【问题讨论】:
表user
不存在,它被称为users
表(注意复数形式)。请改用[...].select('users.fname [...]
我确实尝试过,但我得到了一个稍微不同的错误消息:Mysql2::Error: Unknown column 'pto_requests.user_id' in 'on clause': SELECT users.fname as user_name FROM pto_requests
INNER加入users
ON users
.id
= pto_requests
.user_id
ORDER BY pto_requests
.id
ASC LIMIT 1
根据文档,您应该使用users
的单数版本来调用add_reference
:api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/…。您应该回滚该迁移(以便删除该列),重写代码以将迁移文件中的users
更改为user
,然后重新运行迁移。
为什么不使用 belongs_to :pto_requests
进行迁移? guides.rubyonrails.org/… 一种故障保护
谢谢,我之前也尝试过,但是在收到与 nil 值相关的新错误后,我现在意识到我必须进入我的数据库并手动输入一些值,因为更改列删除了导致这种情况的旧值。我也想测试我的其他表,但我感觉我在多个地方都犯了这个错误。
【参考方案1】:
你完全误解了这些关联。
belongs_to
创建一对一或一对多关联并将外键列放置在此模型表中:
class PtoRequest < ApplicationRecord
belongs_to :user, optional: true
end
因此,此关联将引用pto_requests.user_id
。您已将外键添加到错误的表中。
要生成正确的迁移运行:
rails g migration add_user_to_pto_requests user:references
您所引用的实体应始终为单数。
【讨论】:
嗨,据我了解,由于上述评论,我相信我现在已经正确完成了迁移,在我创建迁移后,“user_id”目前在“pto_requests”中。我无法将他的 cmets 标记为答案,因为它们是 cmets 而不是问题答案。以上是关于Ruby on Rails - ActiveRecord 关联问题:查询未正确进行(单数与复数?)的主要内容,如果未能解决你的问题,请参考以下文章
ruby on rails - 问题捆绑安装nokogiri 1.7.2 on ruby on rails 4.x.