【问题标题】:Rails scope works fine with SQLite and MySQL but doesn't on Heroku (PostgreSQL)Rails 范围适用于 SQLite 和 MySQL,但不适用于 Heroku (PostgreSQL)
【发布时间】:2011-11-28 19:04:21
【问题描述】:
scope :unapproved, lambda {|event| where("event_id = ? AND status IS NOT ?",
event.id, "approved")}
:unapproved 范围适用于 SQLite 和 MySQL,但不适用于使用 PostgreSQL 的 Heroku。我不知道如何让它与 PostgreSQL 一起工作。
【问题讨论】:
标签:
ruby-on-rails
sqlite
postgresql
heroku
scope
【解决方案1】:
PostgreSQL 不使用IS 或IS NOT 进行一般比较,您需要<> 或!=:
where("event_id = ? AND status <> ?", event.id, "approved")
<> 应该也可以在 MySQL 和 SQLite 中使用,除非您想与 NULL 进行比较,然后您必须在任何地方使用 IS NULL 或 IS NOT NULL。
IS 用于特殊比较,例如 IS NULL 和 IS DISTINCT FROM,有关详细信息,请参阅 PostgreSQL 手册的 Comparison Operators 部分。
如果您打算在 Heroku 上进行部署,那么您确实应该在 PostgreSQL 之上进行开发(8.3 用于共享数据库,9.0 用于专用数据库)。 PostgreSQL 比 SQLite(和 MySQL)严格一些,没有 ORM 可以完全隔离数据库之间的差异。 GROUP BY 的行为是从 SQLite/MySQL 迁移到 PostgreSQL 时的另一个常见问题,因此您可能需要查看所有分组;另外,请检查您如何处理对于您的 varchar 列来说太长的字符串,AFAIK SQLite 会忽略您的大小限制,但是如果您尝试超过列大小,PostgreSQL 会大声抱怨(并且 MySQL 将截断您的数据并发出警告,除非您已将服务器置于严格模式)。
【解决方案2】:
scope :unapproved, lambda { |event|
where("event_id = ?", event.id).
where("status != ?", "approved")
}