2015-05-21 28 views
7

我需要這個SQL查詢的Rails友好:Ruby on Rails的:執行SQL DATE_ADD()函數和IF條件

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'); 

這是我的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]") 

我想做的事:

  • 實施IF條件,以管理的情況下,賣場availability_offset它的值是NULL。

  • 執行DATE_ADD()函數能夠將availability_offset值添加到日期release date

我該怎麼做,而不使用SQL sintax,只是ActiveRecord?謝謝!

+0

什麼是數據庫引擎的名字嗎? –

+0

嗨,我使用MySQL。 – mariec

+0

我還需要Ruby中的DATE_ADD(不是Rails) - 增加了賞金 –

回答

1

您只需將您選擇的SQL複製到Rails ActiveRecord select中。試着這樣做:

@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]") 

對於選擇您的if語句,用別名列到store_availability_offset。我希望這對你有所幫助。

1

我會放在if條件,並在產品類中的date_add(),覆蓋release_date屬性並保持ActiveRecord的查詢,你寫的:

class Product < ActiveRecord::Base 

    def release_date 
    read_attribue(:release_date) + (availability_offset ||0) 
    end 

end