SORU
3 AĞUSTOS 2010, Salı


Raylar bir model için varsayılan sıralama düzeni?

Varsayılan sıralama benim model için belirtmek isterim.

.order() belirtmeden .where() ben ne zaman varsayılan sıralama kullanır. Ama ben bir belirtirseniz .order() varsayılan geçersiz kılar.

CEVAP
10 NİSAN 2011, Pazar


default_scope (Raylar 2.3, 3 , 4.0), burada tam sözdizimi eserleri:

class Book < ActiveRecord::Base
  default_scope order('created_at DESC')
end

alan created_at olduğu varsayılan yapılması sıralama istiyorsun.
(Raylar 2default_scope :order => 'created_at DESC'.x)

Not:ASCArtan için kullanılacak kodAZAazalan (desc,DEĞİLdsc !).
Ayrıca kullanabileceğiniz kullanılan olduğunuzda '(az önce aradı 'kapsam' raylar 3), örn .' named_scope

class Book < ActiveRecord::Base
  named_scope :published, :conditions => { :published => true }
  scope :confirmed, :conditions => { :confirmed => true } # Rails 3 - just 'scope'
end

:published kapsam Book.published yerine verir Book.find(:published => true).

İle 'zincir' bu yöntemleri dönemleri ile birleştirerek birlikte aralarında kapsamları ile yukarıda şimdi Book.published.confirmed kullanabilirsiniz. 3 raylar
Bu yöntem, sorgunun değil aslında idam kadar gerçek sonuçlar gerekli (tembel değerlendirme), 7 kapsamları birlikte zincirleme olabilir ama sonuç olarak 1 gerçek bir veritabanı sorgu önlemek için performans sorunları yürütülen 7 ayrı sorgular.

Kullanabilirsiniz geçirilen parametre olarak bir tarih ya da bir user_id (bir şey değişecek de çalışma zamanı ve gereken tembel değerlendirme, bir lambda, bu gibi:

scope :recent_books, lambda 
  { |since_when| where("created_at >= ?", since_when) }
  # Note the `where` is making use of AREL syntax added in Rails 3.

Son olarak varsayılan kapsamı ile devre dışı bırakabilirsiniz

Book.with_exclusive_scope { find(:all) } 

hatta daha iyi:

Book.unscoped.all

herhangi bir filtre (koşulları) veya sıralama (order by) devre dışı bırakır.

Rails2 çalışıyor ilk versiyonu ikincisi ise () unscoped Rails3 için olduğunu unutmayın


Bu yüzden ... eğer, öyle düşünüyorsan, o yüzden bu yöntemler gibi... o zaman, evet, bu kapsamları tam olarak ne!
def self.method_name ...code... end sahip gibi ama her zaman ruby ile güzel küçük sözdizimsel kısayolları gibi (ya da 'şeker') şeyler sizin için daha kolay hale getirmek için!

Aslında 1 'hepsi' kayıtları. set üzerinde faaliyet olarak Sınıf düzeyi yöntemleridir

Ancak onların biçim değiştirme4 kullanırken admin uyarı var raylar ile #çağrılabilir bir nesne geçmeden kapsamı.Örnek kapsam :kırmızı(renk: kırmızı) scope :red, -> { where(color: 'red') } değiştirilmelidir.

Bir tarafı olarak yanlış kullanıldığında, dikkat edinvarsayılan_scope kötüye kullandı.
Bu esas wheregibi eylemler için kullanılan geldiğinde'(süzme) s sınırlayıcıvarsayılan(a . seçim ^strong>kötü fikirsadece bir varsayılan) yerine sonuçları sıralama için kullanılıyor.
where seçimler için, sadece düzenli scopes adında kullanın. ve bu kapsam published adında bir kapsamı olduğu sorgu, örneğin Book.all.published ekleyin.

Sonuç olarak, kapsamları gerçekten harika şeyler için model içine itmek için yardımcı bir yağ modeli ince kontrolör Kurutma makinası yaklaşım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cole Rolland

    Cole Rolland

    23 Kasım 2008
  • eurotuner

    eurotuner

    6 Mart 2006
  • FD2097

    FD2097

    21 HAZİRAN 2009