2012-09-26 10 views
5

Podobnie jak w przypadku carvil mam w moim modelu datetime dla created_at chociaż chciałem "równy" predykatu porównać data created_at i datę (jak "2012-09-26").Ruby on Rails Ransack Datetime do tej pory wyszukiwania

Więc dodałem w moim modelu (aby dodać lanego atrybuty i zdjąć starą 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 

Ale kiedy potwierdzić zapytanie (created_at równa „2012-03- 24') mam ten błąd:..

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

Niespodziewanie, współpracuje z «większe niż» i «mniej niż» tylko «równa się» występuje ten błąd

zrobiłem wszystko dla wszystkich moich mo dels i 60% działa (pozostałe 40% występuje ten błąd).

W konsoli:

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

dzięki za pomoc

EDIT:

Mam default_scope co sprawia: Pozycja (: deleted_at false)

Ale nie wiem, dlaczego pojawia się błąd

+0

Wygląda to tak nie został rozwiązany jeszcze: https://github.com/activerecord-hackery/ransack/issues/34 . Czy zdarzyło Ci się, że Twój problem został rozwiązany? –

Odpowiedz

1

Proszę zmienić Arel::Nodes::SqlLiteral.new('date(column_name)') z Arel.sql('date(column_name)').

składni będzie ::

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 

I hove to byłoby pomocne.

1

miałem pewne problemy z tym, i przyszedł z tym:

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