2011-04-08 11 views
31

Rails'teki Rails'i kullanma - SELECT * FROM table'u etkin bir şekilde sonuçlandıran ve daha da fazla işlem yapabileceğim bir ActiveRecord::Relation oluşturmak için bir yol arıyorum.Rails/Arel: Tüm kayıtları ActiveRecord :: Relation olarak seçme

Örneğin, birden çok kategoriye ayırdığımız oluyor bir model var ve aşağıdaki şekilde bunlar için sayıları dönmek: Bu iyi çalışır, ve COUNT sorguları kapalı ateş avantajına sahiptir

relation = Model.where(:archived => false) # all non-archived records 
record_counts = { 
    :total => relation.count, 
    :for_sale => relation.where(:for_sale => true).count 
    :on_auction => relation.where(:on_auction => true).count 
} 

MySQL, aslında kayıtları kendileri seçmek yerine.

Ancak, artık arşivlenmiş kayıtları sayımlara eklemem gerekiyor, ancak relation = Model.all bir Array sonuçlarıyla sonuçlanıyor ve ben bir ActiveRecord::Relation arıyorum. Bunu yaparken düşünebilirsiniz

tek yolu çalışır, ama biraz saçma görünüyor model.where(model.arel_table[:id].not_eq(nil)) vardır.

Bu konuda herhangi bir ışık tutabilir mi?

cevap

11

: Raylar 3.x için Model.where(nil)

: Raylar 4.0 için (daha önce yoktu) bir ilişki

döndürür Model.allModel.scoped

+0

Raylar 4.0.13 üzerinde, 'Model.all' Model.scoped' kaldırıldı' ilişki geri döner ve. – Tsutomu

48

relation = Model.scoped deneyin. Bu size gerçek sonuçlar yerine ilişkiyi verecektir.

+0

Mükemmel, teşekkür ederim ! Sadece 10 dakika içinde kabul edebilirim. – Jeriko

+0

'Model.scoped' raylar 4.x kaldırıldı Diğer cevaba bakınız. Farklı Raylar versiyonlarının daha eksiksiz bir resmini sunar beri –

+1

Tekrar teşekkürler, şimdi Kyle'ın cevabını kabul ettik. Eğer Model.all' 'gibi kayıtların hepsi hareket istediğinizde – Jeriko

1

Sen isteyeyim: Eğer ilişki ne olduğunu görmek ise, aslında bir ActiveRecord::Relation içindedir

relation = Model.scoped 

.

bu sayfadan görebileceğiniz gibi:

http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html#method-i-scoped

yazıyor şu: ara geçirerek nerede prosedür, karmaşık sorguları oluşturulurken

Anonim kapsamları yararlı olurlar birinci sınıf nesneleri gibi değerler (kapsamları) uygundur. Raylar 4.1 ve daha sonraki

+0

sadece zaman' scoped' gerçekten gerekli olduğunu. Sadece bir 'Model.where (: archived => false)' yapmak, zaten bir 'ActiveRecord :: Relation' nesnesini döndürecektir. –