【问题标题】:column is there, but I receive: SQLite3::SQLException: no such column: requestor.birthyear列在那里,但我收到:SQLite3::SQLException:没有这样的列:requestor.birthyear
【发布时间】:2017-03-07 02:47:29
【问题描述】:

我有一个会议表,其中有一个请求者(用户),其属性为birthyear。

在终端我可以做 Meeting.find(1).requestor.birthyear

但在会议控制器中,它显示no such column: requestor.birthyear

我尝试在 meeting_params 中添加类似 users_attributes: [:birthyear] 的内容,但没有任何区别。

我错过了什么?

以下是完整文件: 会议控制者

def community
  if current_user.birthyear != nil
    @meeting_requests = Meeting.where('meeting_time >= ? AND requestee_id IS ? AND status = ? AND (requestor.birthyear <= ? AND requestor.birthyear >= ?)', Date.today, nil, "Active", current_user.birthyear + 10, current_user.birthyear - 10).order('meeting_time asc')
  end
end

会议模型

class Meeting < ApplicationRecord
    belongs_to :requestor, class_name: "User"
    belongs_to :requestee, class_name: "User"
end

错误:

SQLite3::SQLException: no such column: requestor.birthyear: SELECT "meetings".* FROM "meetings" WHERE (meeting_time >= '2017-03-06' AND requestee_id IS NULL AND status = 'Active' AND (requestor.birthyear <= 1944 AND requestor.birthyear >= 1924)) ORDER BY meeting_time asc

如果您需要任何进一步的信息,请告诉我 - 提前致谢!

更新

尝试加入查询中的表,但对此不太了解。我正在尝试:

@meeting_requests = Meeting.where('meeting_time >= ? AND requestee_id IS ? AND status = ? ', Date.today, nil, "Active").order('meeting_time asc').joins("INNER JOIN users on requestor.birthyear >= current_user.birthyear + 10")

但得到:

ActionView::Template::Error (SQLite3::SQLException: ambiguous column name: status: SELECT "meetings".* FROM "meetings" INNER JOIN users on requestor.birthyear &gt;= current_user.birthyear + 10 WHERE (meeting_time &gt;= '2017-03-07' AND requestee_id IS NULL AND status = 'Active' ) ORDER BY meeting_time asc):


*****更新***** 我发布了另一个问题以获取语法。如果它帮助任何人: Rails: Two 'where' queries - each works individually, but not together

【问题讨论】:

    标签: ruby-on-rails ruby sqlite


    【解决方案1】:

    requestorrequestee 是 Rails 关联。这意味着 Rails 了解如何从会议中获取 requestor...

    但是 - 您的数据库不知道 requestor 是什么。所以你不能像你在这里所做的那样把它放到 SQL 查询的字符串部分:

     AND (requestor.birthyear <= ? AND requestor.birthyear >= ?)'
    

    相反,您需要使用连接将这些添加到您的查询中,然后弄清楚 rails 如何命名它们以便从中访问列。

    【讨论】:

    • 如果是这种情况,为什么我可以在终端里做,它明白我在说什么,但在控制器里却不行?我正在调用同一个数据库。另外 - 我该怎么做。我已经以这种方式设置了数据库,因此很遗憾,不能使用连接表重做整个数据库。
    • 你到底在终端做什么?
    • " 已经以这种方式设置了数据库,因此很遗憾,不能使用连接表重做整个数据库。"哎呀,这不是我的建议...我将其表述为连接表的错误...我的意思是将表作为连接添加到您的查询中。
    • 我可以做一些像 Meeting.find(1).requestor.birthyear 这样的事情,它给了我用户的出生年份。所以,我想我可以用同样的方式查询
    • Meeting.find(1).requestor.birthyear 但这就是我所说的 Rails 的意思,了解requestor 是什么……那是您刚刚编写的 ruby​​ 代码。但是,您在传递给where 的字符串中输入的内容会直接进入数据库……它不是 ruby​​……它只会是 SQL
    猜你喜欢
    • 2016-01-19
    • 2022-08-15
    • 2013-10-09
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    相关资源
    最近更新 更多