ruby-on-rails - Ruby on Rails - ActiveRecord 协会问题 : Queries Not Being Made Properly (singular vs. 复数?)

标签 ruby-on-rails ruby activerecord associations

我觉得我必须在这里发表的第一篇文章,通常我的问题只需阅读其他文章就能得到解答,但这次我觉得我太深了,找不到合适的答案,我一直在寻找一会儿。我的代码中可能存在多个问题。

我是 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 JOIN users ON users.id = >pto_requests.user_id ORDER BY pto_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/

相关文章:

javascript - 从 javascript/jquery 创建 Flash 消息

ruby - 可以在 Hash each 循环中访问索引吗?

ruby - 规范: "describe MyClass::Something do"

ruby-on-rails - 记录更改等待特权用户的批准;它就像版本控制与批准相结合

mysql - 使用 rails/activerecord 与 MySQL 数据库通信时,我可以设置 max_allowed_pa​​cket 吗?

ruby-on-rails - ruby rails : Editor for backend of the web application

ruby-on-rails - rails : use jbuilder template in various controller methods

ruby-on-rails - 在 Linux mint 上安装 Ruby on Rails?

ruby-on-rails - Rails 部分的屈服

php - 使用 codeigniter 的事件记录在 SQL 语句末尾放置 where 子句