2013-03-07 23 views
6

Örneğin, start_date ve length ile bir olayım var (gün sayısını tamsayı olarak). Ben end_datestart_date + length.days olarak tanımladığımız modelde Rails & Ransack - Modeldeki bir tanıma göre sıralama/arama

çok basit beklediğiniz gibi:

def end_date 
    start_date + length.days 
end 

Tüm şablonunda çalışıyor, ben başlangıç ​​tarihini görüntülemek için event.end_date kullanabilirsiniz artı kaç gün boyu olarak ayarlandı ancak , ancak, şimdi Ransack kullanarak olayları bitiş tarihine göre sıralamak istiyorum.

start_date için sıralama bağlantı şuna benzer: Ben tablodaki bir sütun olarak end_date arayan ve onu bulmak değil tahmin olarak <%= sort_link @q, :start_date, "Start" %>

ben end_date (<%= sort_link @q, :end_date, "End" %>) için aynı çalışırsanız ne yazık ki sessizce başarısız olur.

Sadece aptal mıyım yoksa Ransack bir şey yapmaya çalışmıyorum mı? Sonra bir 'ranksacker' yöntemi eklendi ben end_date

def end_date 
    start_date + length.days 
end 

tanımlanan modelde

: Sadece nasıl yaptığımı görmek isteyen herkes yararına

+0

ransack, arama parametrelerini ActiveRecord ORM'deki sorgulara çevirir - temelde DB'nin üzerinde arama yapabileceği gerçek bir sütun olmadıkça kesinlikle başarısız olur. – bdares

+0

Yorum için teşekkürler @bdares. Şu anda modelde ransacker: end do | r | 'ayarlamayı başardım:“ Arel :: Nodes :: SqlLiteral.new ("DATE_ADD (events.start_date, INTERVAL events.length DAY)"). Hangi sorguyu üretir: 'DISTINCT olayları SEÇİN. * DATE_ADD (events.start_date, INTERVAL events.length GÜNDÜZ) SİPARİŞİNDEN OLUŞTURULAN olaylardan. DESC LIMIT 30 OFFSET 0'. Bu işe yarıyor ama korkunç 'hacky' hissediyor. – bensmithbwd

+0

@bensmithbwd - Yorumunuzda tam çözümü görmek zor. Çözümün daha iyi anlaşılmasını sağlayabilmek için tam bir örnek oluşturmaya özen gösterin. Sonra kendi cevabınızı kabul edebilirsiniz. –

cevap

10

end_date

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

Yukarıdaki cümleyi yapmanın en iyi/doğru yolu olup olmadığını bilmiyorum, ancak Ruby/Rails'e göre SQL'e çok daha aşina olduğum için bu yüzden açık kaldım. Bu etkili bir şekilde ne yapar

hangi verir (end_date aynı tanım gereği bir sorgu (başlangıç_tarihi + uzunluk)

Şimdi şablonunda bir çeşit bağlantısı için aşağıdaki kodu kullanabilirsiniz emri SQL bir parça oluşturmak olduğunu Ransacker wil_paginate vs vs müdahale ASC/DESC işlemek ve değil):

: bu bağlantıyı tıkladığınızda

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

sen çizgisinde bir sorgu alırsınız- Tümü, Ransacker tarafından masaüstünüzde bile mevcut olmayan bir sütun üzerinde oluşturuldu ve işlendi!

Yine de, hızlı bir feragatname, yaklaşık 2 hafta boyunca Rails ve Ruby'yi öğreniyorum, PHP'nin bir arka planından geliyor, bu yüzden NO WAY'da bir uzmanım ve bu da çok verimsiz olabilir veya çok fazla olabilir. Sadece bilmediğim daha iyi 'raylar yolu'.