Rails 5范围问题

时间:2018-08-19 03:57:45

标签: ruby-on-rails ruby-on-rails-5

在使用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子句需要使用引号 ,并且statusesstatus的正确复数。

重新启动后,praga2050描述的where(status_date: date)格式就起作用了,Kedarnag Mukanahallipatna建议的where("statuses.status_date = ?", date)也起作用了。

经验教训:reload!不会重新加载模型中的更改;您必须重新启动控制台才能识别模型更改。看到这样的答案:https://stackoverflow.com/a/5428421/446464

2 个答案:

答案 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?}