【发布时间】:2019-01-25 14:44:56
【问题描述】:
在带有 Postgresql 的 rails 5 中,我正在编写一个范围来按日期选择状态项。我的模型是:
class Status < ApplicationRecord
scope :in_month, ->(date){where("status_date = ?", date) if date.present?}
end
但是,在rails console 中,尝试使用范围时出现以下错误。
```
2.4.0 :010 > Status.in_month("2018-06-01")
Status Load (11.7ms) SELECT "statuses".* FROM "statuses" WHERE (status.status_date = '2018-06-01') LIMIT $1 [["LIMIT", 11]]
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "status"
LINE 1: SELECT "statuses".* FROM "statuses" WHERE (status.status_da...
^
: SELECT "statuses".* FROM "statuses" WHERE (status.status_date = '2018-06-01') LIMIT $1
请注意,由于某种原因,它试图访问表“状态”,而不是“状态”。
我到底做错了什么?这几乎直接来自 RailsGuide。
编辑和“修复”
哼...Rails 控制台显然处于错误状态。我在下面的 cmets 之后重新启动了控制台,发现我的查询运行良好。请注意,这种 WHERE 子句格式需要引号,并且statuses 是status 的正确复数形式。
重启后,praga2050 描述的where(status_date: date) 格式有效,Kedarnag Mukanahallipatna 建议的where("statuses.status_date = ?", date) 也有效。
经验教训:reload! 不会重新加载模型中的更改;您必须重新启动控制台才能识别模型更改。看到这个答案:https://stackoverflow.com/a/5428421/446464
【问题讨论】:
-
这是整个
Status类吗?ApplicationRecord有什么事吗?该范围根本不应该添加任何表前缀。 -
你可以试试
scope :in_month, ->(date){where("statuses.status_date = ?", date) if date.present?} -
确保将
statuses括在 `` 中 -
@KedarnagMukanahallipatna - 您的示例中有一个额外的空间,但是通过该修复它也可以正常工作 - 请参阅我的编辑。
标签: ruby-on-rails ruby-on-rails-5