Ruby on rails:执行SQL DATE_ADD()函数和IF条件

mar*_*iec 7 sql ruby-on-rails rails-activerecord

我需要这个SQL查询Rails友好:

SELECT *,
IF (store.availability_offset IS NULL, DATE_ADD(product.release_date, INTERVAL 0 DAY), DATE_ADD(product.release_date, INTERVAL store.availability_offset DAY))
FROM products JOIN stores ON product.store_id = stores.id
WHERE (DATE_ADD(products.release_date, INTERVAL stores.availability_offset DAY) BETWEEN '2013-06-12' AND '2014-07-12' OR DATE_ADD(products.release_date, INTERVAL 0 DAY) BETWEEN '2013-06-12' AND '2014-07-12');
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的Rails查询:

@products = Product.joins(:store).where("products.release_date >= :start_date AND products.publishing_date <= :end_date)", :start_date => params[:search][:start_date], :end_date => params[:search][:end_date]")
Run Code Online (Sandbox Code Playgroud)

我想做的事:

  • 实现IF条件,以便availability_offset在其值为NULL的情况下管理商店.

  • 实现DATE_ADD()能够将availability_offset值添加到日期的功能release date.

如果不使用SQL sintax,只需ActiveRecord,我怎么能这样做?谢谢!

akb*_*bin 1

您只需将 SQL 选择复制到 Rails ActiveRecord 选择中即可。尝试这样做:

@products = Product.select('products.*, IF(store.availability_offset IS NULL, DATE_ADD(products.release_date, INTERVAL 0 DAY), DATE_ADD(products.release_date, INTERVAL stores.availability_offset DAY)) AS store_availability_offset')
    .joins(:store).where("products.release_date >= :start_date AND products.publishing_date <= :end_date)", :start_date => params[:search][:start_date], :end_date => params[:search][:end_date]")
Run Code Online (Sandbox Code Playgroud)

对于ifselect 中的语句,我使用 alias column into store_availability_offset。我希望这对你有帮助。