2012-09-26 98 views
5

像carvil我在我的模型中有一個日期時間created_at,雖然我想要「等於」謂詞來比較created_at和日期(如'2012-09-26')。Ruby on Rails Ransack日期時間到日期搜索

所以我在我的模型中加入(爲了增加鑄造屬性,並取下舊created_at/update_at/deleted_at:

ransacker :created_at do 
    Arel::Nodes::SqlLiteral.new("date(items.created_at)") 
end 

ransacker :updated_at do 
    Arel::Nodes::SqlLiteral.new("date(items.updated_at)") 
end 

ransacker :deleted_at do 
    Arel::Nodes::SqlLiteral.new("date(items.deleted_at)") 
end 

# Hide some attributes for advanced search 
UNRANSACKABLE_ATTRIBUTES = ["created_at", "updated_at", "deleted_at"] 

def self.ransackable_attributes auth_object = nil 
    (column_names - UNRANSACKABLE_ATTRIBUTES) + _ransackers.keys 
end 

但是,當我確認查詢(created_at等於「2012-03- 24' ),我有這樣的錯誤:。

NoMethodError (undefined method `name' for "date(items.created_at)":Arel::Nodes::SqlLiteral): 

出人意料的是,它的工作原理與和‘小於’只有‘等於’會出現此錯誤‘大於’

我做這一切的一切我莫dels和60%的工程(剩下的40%發生這個錯誤)。

在控制檯:

irb(main):232:0> Item.search(:created_at_eq => Date.today.to_s).result 
(Object doesn't support #inspect) 

感謝您的幫助

編輯:

我有一個default_scope這使得: 項目(:deleted_at假)

但我不知道爲什麼會出現這個錯誤

+0

它看起來像這樣一直沒有得到解決尚未:https://github.com/activerecord-hackery/ransack/issues/34 。你有沒有想過你的問題? –

回答

1

請將Arel::Nodes::SqlLiteral.new('date(column_name)')更改爲​​。

你的語法爲::

ransacker :created_at do 
    Arel.sql("date(items.created_at)") 
end 

ransacker :updated_at do 
    Arel.sql("date(items.updated_at)") 
end 

ransacker :deleted_at do 
    Arel.sql("date(items.deleted_at)") 
end 

我掀掉這將是有益的。

1

我遇到了一些問題,這一點,這個就來了:

ransacker :created_at, type: :date do 
    Arel.sql('date(created_at)') 
end