Mysql 异常ActiveRecord::语句无效不';t工作

Mysql 异常ActiveRecord::语句无效不';t工作,mysql,ruby-on-rails,postgresql,activerecord,exception-handling,Mysql,Ruby On Rails,Postgresql,Activerecord,Exception Handling,我对Rails比较陌生,所以我不知道我解决问题的方法是否正确,但它有一些问题 我已经在我的PC上安装了MySQL,但是Heroku使用PostgreSQL,所以我正在设计一个解决方案,以便在某些问题上同时使用这两种DBMS 我有下一个代码: begin @products_with_valid_offers = Product.joins(:variants).active.discount_valid.discount_date_valid_mySQL rescue Active

我对Rails比较陌生,所以我不知道我解决问题的方法是否正确,但它有一些问题

我已经在我的PC上安装了MySQL,但是Heroku使用PostgreSQL,所以我正在设计一个解决方案,以便在某些问题上同时使用这两种DBMS

我有下一个代码:

begin
   @products_with_valid_offers = Product.joins(:variants).active.discount_valid.discount_date_valid_mySQL

   rescue ActiveRecord::StatementInvalid
      @products_with_valid_offers = Product.joins(:variants).active.discount_valid.discount_date_valid_postgreSQL
end
范围包括:

scope :active,  includes([:assets, :store]).where(:active => true, :deleted_at => nil, :stores => { :deleted_at => nil, :active => true }).order("products.created_at DESC")
scope :discount_date_valid_mySQL, where('DATE_FORMAT(NOW(),"%Y-%m-%d 23:59:59") + '" BETWEEN discount_from AND discount_to')
scope :discount_date_valid_postgreSQL, where('now()::date BETWEEN discount_from AND discount_to')
如您所见,我需要两个不同的表单来管理日期格式,每个表单都有一个DBMS。 问题是流从未进入异常。如果@products\u with\u valid\u offers在MySQL中是一个SQL错误,则从不进入rescue块执行PostgreSQL行,并返回一个错误


请给我一些帮助D

您的报价在
折扣\u日期\u有效\u mySQL
中出错,您想这样说:

scope :discount_date_valid_mySQL, where("DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') BETWEEN discount_from AND discount_to")
这至少是有效的Ruby代码

也就是说,您当前的方法在各个方面都很糟糕:

  • 您要确保在生产过程中始终存在异常
  • 您在一个数据库之上开发,但在另一个数据库之上部署,仅此一项就将导致各种问题
  • 您应该在MySQL版本中只使用
    date\u格式(now(),“%Y-%m-%d”)
可能还有其他问题,但没有必要花更多的时间来区分代码:有更好的方法。MySQL和PostgreSQL(甚至SQLite)都支持
current\u date
,因此您可以对两者使用一种方法:

scope :discount_date_valid, where('current_date between discount_from and discount_to')
当然,假设您希望一切都假设为UTC。如果您希望使用其他时区,则:

  • 将您的
    折扣\u从
    折扣\u到
    存储为日期列,日期在SQL中没有时区。想必你已经这么做了,但我只是想确定一下
  • 调整范围以从客户端代码中获取当前日期(可能配置为使用正确的时区):

  • 必须对作用域使用类方法,以确保在正确的时间(即使用作用域而不是加载类时)计算
    Date.today


    如果您要在PostgreSQL之上部署,那么您真的应该在PostgreSQL之上开发。您甚至应该确保在同一版本的PostgreSQL上开发和部署。在一个堆栈上开发,在另一个堆栈上部署,会导致各种毫无意义的挫折和困惑。

    非常感谢!!。它起作用了!!:我从未想过当前的_date函数可以在两个DBMS中都工作。我尝试了其他函数,但给了我错误,所以我尝试了例外,我会接受你的建议,老师。谢谢!!PD:但是这个异常从未被捕获,错误就一直以这种方式隐藏着。@DavidMendiola:你确定
    ActiveRecord::StatementInvalid
    是正确的异常吗?是的,因为rails会这样标记它。另外,这是一个无效的语句,因为我使用一个用于mySQL的语句,另一个用于PostgreSQL。如果一个失败是因为它不是有效的语句
    def self.discount_date_valid
        where(':current_date between discount_from and discount_to', :current_date => Date.today)
    end