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 JOIN users ON users.id = >pto_requests .user_id ORDER BY pto_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如何安装

ruby on rails - 问题捆绑安装nokogiri 1.7.2 on ruby on rails 4.x.

Ruby on Rails入门篇

markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails

ruby Ruby on Rails:常见路由

ruby Ruby on rails类