2013-03-07 61 views
6

說例如我有一個事件start_datelength(以整數表示天數)。Rails&Ransack - 根據模型中的定義進行排序/搜索

在我定義end_datestart_date + length.days模型很簡單,你所期望的:

def end_date 
    start_date + length.days 
end 

所有在模板中正常工作,我可以用event.end_date顯示起始日期加上然而,許多天長度爲,但是,我想現在使用Ransack命令結束日期。

的排序鏈接start_date看起來是這樣的:<%= sort_link @q, :start_date, "Start" %>

如果我嘗試END_DATE(<%= sort_link @q, :end_date, "End" %>)同它作爲我相信它是尋找end_date作爲表中的列,並沒有找到這不幸的是靜靜地失敗。

我只是很笨或我想做點什麼Ransack根本就沒做?

+0

看起來像ransack將搜索參數轉換爲ActiveRecord ORM上的查詢 - 除非您有底層數據庫可以搜索的實列,否則這肯定會失敗。 – bdares 2013-03-07 02:06:18

+0

感謝評論@bdares。我現在已經設法在模型中設置'ransacker:end do | r |'爲:'Arel :: Nodes :: SqlLiteral.new(「DATE_ADD(events.start_date,INTERVAL events.length DAY)」)'。它產生查詢:'SELECT DISTINCT events。* FROM events ORDER BY DATE_ADD(events.start_date,INTERVAL events.length DAY)DESC LIMIT 30 OFFSET 0'。這確實有用,但感覺非常「可笑」。 – bensmithbwd 2013-03-07 03:15:08

+0

@bensmithbwd - 在評論中很難看到完整的解決方案。謹慎寫出一個完整的例子,以便我們更好地理解解決方案。然後你可以接受你自己的答案。 – 2013-03-13 02:16:48

回答

10

只爲任何人想要看我是怎麼做的的好處:

在我定義END_DATE

def end_date 
    start_date + length.days 
end 

模型,然後我加了一個「ranksacker」的方法爲:END_DATE

ransacker :end_date do |r| 
    Arel::Nodes::SqlLiteral.new("DATE_ADD(`events`.`start_date`, INTERVAL `events`.`length` DAY)") 
end 

我真的不知道這是否是做上述條款的最佳/正確的方法,但我比SQL/Ruby更熟悉SQL,因此它對我來說非常開放。

什麼是有效的作用是創建一塊SQL的是訂單減少相同的定義查詢爲END_DATE(起始+長度)

我現在可以在模板中使用的一種鏈接下面的代碼(它允許Ransacker處理ASC/DESC,而不是與wil_paginate等等等等干擾):

<%= sort_link @q, :end_date, "Event End Date" %>

當你點擊該鏈接,你會得到的線沿線的查詢:

SELECT DISTINCT events.* FROM events ORDER BY DATE_ADD(events.start_date, INTERVAL events.length DAY) DESC LIMIT 30 OFFSET 0 - 所有由Ransacker在您的表中甚至不存在的列上創建和處理!另外,一個快速免責聲明,我一直在學習Rails和Ruby大約2周,來自PHP的背景,所以我不是專家,這可能是非常低效的,或者可能會有很多更好的'軌道',我根本不知道。

相關問題