在使用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控制台处于错误状态。我在下面的评论后重新启动控制台,发现我的查询运行正常。请注意,这种格式的WHERE子句需要使用引号 ,并且statuses
是status
的正确复数。
重新启动后,praga2050描述的where(status_date: date)
格式就起作用了,Kedarnag Mukanahallipatna建议的where("statuses.status_date = ?", date)
也起作用了。
经验教训:reload!
不会重新加载模型中的更改;您必须重新启动控制台才能识别模型更改。看到这样的答案:https://stackoverflow.com/a/5428421/446464
答案 0 :(得分:-1)
我认为您错过了Rails中的命名约定。
模型类名是单数,并且将自动映射到复数数据库表名。
据此,您可以将模型名称更改为statuses
。
或设置在Rails模型中使用的表名:
class Status < ApplicationRecord
self.table_name = 'status'
scope :in_month, ->(date) { where(status_date: date) if date.present? }
end
答案 1 :(得分:-2)
我不确定为什么要将字符串放在Where子句中
scope :in_month, ->(date){where("status_date = ?", date) if date.present?}
应该进行如下更改。
下面的一个应该为您工作。
scope :in_month, ->(date){where(status_date: date) if date.present?}