【问题标题】: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 不使用ISIS NOT 进行一般比较,您需要<>!=

    where("event_id = ? AND status <> ?", event.id, "approved")
    

    &lt;&gt; 应该也可以在 MySQL 和 SQLite 中使用,除非您想与 NULL 进行比较,然后您必须在任何地方使用 IS NULLIS NOT NULL

    IS 用于特殊比较,例如 IS NULLIS 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")
      }
      

      【讨论】:

        猜你喜欢
        • 2011-12-24
        • 1970-01-01
        • 2016-10-10
        • 2014-02-26
        • 2012-04-14
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        相关资源
        最近更新 更多