Soru Ek sql sorgusu olmadan activerecord ilişkisi üzerinde filtreleme?


Ek bir sorgu yürütmeden bir AR sorgusunun sonuçlarını nasıl filtreleyebilirim?

Örneğin.

u = User.where(name: "bob", age: [10, 20])
# 1st select query to db
u.class # ActiveRecord::Relation
tens = u.where(age: 10)
# 2nd select query to db

İkinci sorgunun db'yi çağırmasını istemiyorum, ancak u (1. sorguda) alınan sonuçlara filtre uygulamak istemiyorum.


21
2017-10-23 18:48


Menşei




Cevaplar:


ActiveRecord:Relation sadece db öğelerine erişildiğinde sorgular. Yani sizin gibi bir şey yazmazsanız, dizininiz db'yi çağırmaz. u.first veya tens.first.

Rails konsolunda biraz farklıdır, çünkü her bir ifade sonuçları konsola yazdırılır, böylece her seferinde sorguyu yürütür. Yazdırmayı ekleyerek atlayabilirsiniz ; 1 her ifadeden sonra.

Bir kenara, eğer sonuçları hala ilk sorgu ile filtrelemek isterseniz:

u = User.where(name: "bob", age: [10, 20]) # no query at this point
u.class # ActiveRecord::Relation
u.first # query to db
u.class # Array

tens = u.select{|x| x.age == 10} # no query to db

29
2017-10-23 19:22



Konsol çağırır inspect döndürülmüş nesne üzerinde ve bunu yazdırır. Yöntem inspect için ActiveRecord::Relation aramalar to_a  api.rubyonrails.org/classes/ActiveRecord/... kayıtları yükler ve döndürür api.rubyonrails.org/classes/ActiveRecord/...Bu nedenle gerekli sorguları zaten gerçekleştiriyor. - kristinalim
Ayrıca kullanıyorum ; nil ekleme yerine ; p 1. Sadece ; 1 aslında zaten yeterli olurdu. - kristinalim
Kristinalim doğru ve daha iyi - tihom
Ancak verileri güncellerseniz, ben çalışmıyor: u = Kullanıcı.yer (name: "bob", yaş: [10, 20]) # 1. db u.each'e sorgu seçin {| u | u.firstname = 'birşey'} # sadece bellek tens = u.where (yaş: 10) && -> las güncelleme (dll = 'bir şey') göz önünde bulundurmadan db'ye ikinci erişim -> Konsolda test edilmedi - Albert Català