我觉得我必须在这里发表的第一篇文章,通常我的问题只需阅读其他文章就能得到解答,但这次我觉得我太深了,找不到合适的答案,我一直在寻找一会儿。我的代码中可能存在多个问题。
我是 RoR 的新手,最近几个月才开始使用它。我正在尝试运行测试查询以确保我的关联正常工作,并且根据我遇到的错误,我觉得我搞砸了一些简单的事情。我正在为 Web 应用程序设置几个表,我现在将专注于 2 个表,因为对此的修复可以在以后应用到其他地方。
相关信息:
-我正在使用 Devise 进行用户身份验证
-我有一个 pto_requests_controller.rb 和 registrations_controller.rb(registrations 与 devise 一起用作用户 Controller )
-在数据库中,表名是'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 LIMIT 1
我目前的理论是,它与生成的 SQL 语法末尾的问题有关,因为它正在寻找“user_id”,但这不存在,只有“users_id”存在。非常感谢任何帮助,如果需要更多信息,请告诉我。
最佳答案
您完全误解了这些关联。
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
您引用的实体应该始终是单数。
关于ruby-on-rails - Ruby on Rails - ActiveRecord 协会问题 : Queries Not Being Made Properly (singular vs. 复数?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48894441/