Raylar

2012-07-24 18 views
5

Ben uyarılar için benim indeks sayfasında benim uygulamadanRaylar

class Polling 
has_many :alerts, :dependent => :destroy 

class Alert 
belongs_to :polling 

bir üst/alt ilişkisi olan bir sonucu olarak Active kayıt seçme ebeveyn ve çocuk, ben her bir ebeveynden bazı verileri göstermek gerekir ve bu her biri aracılığıyla döngü vardır ve aynı zamanda ebeveyn nesne çekerken iki sorgular Açıkçası

Alert Load (6.1ms) SELECT * FROM (SELECT * FROM "ALERTS" INNER JOIN "POLLINGS" ON "POLLINGS"."ID" = "ALERTS"."POLLING_ID" ORDER BY "ALERTS"."ID" DESC) WHERE ROWNUM <= 1 
Polling Load (1.8ms) SELECT "POLLINGS".* FROM "POLLINGS" WHERE "POLLINGS"."ID" = 10113 AND ROWNUM <= 1 

sonuçlanır, bu sayfa yükleme süresi oldukça korkunç hale getirir.

Ben

> Alert.joins(:polling).where(...) 
> Alert.includes(:polling).where(...) 
> Alert.joins(:polling).select('*').where(...) 

gibi bir kaç şey, denedim Ve ben indeks sayfasını ziyaret ettiğinizde her zaman iki ayrı sorgular olsun. Her bir Uyarı için bir tane ve daha sonra ebeveyn verilerini almak için başka bir tane. Bunu bir satırda nasıl yapabilirim, böylece uyarıları aldığımda da ilişkili ebeveyn verilerini alırım? Diğer ucundan gitmenin bir yolu yok gibi görünüyor çünkü eğer bir Pollings.where(...) yaparsam çocukları bir grup olarak yakalamıyor. Eğer ayrıntılı olarak SQL belirtmek istiyorsanız

+1

İçerme yöntemiyle kesinlikle doğru yoldasınız. Diğer açı Polling.includes (: alert) .where (...) denemek olacaktır. Görüntüleme kodunuzu gönderir misiniz? – steakchaser

+0

Buradaki şey, ebeveyn tarafına değil, çocuk tarafına gitmeliyiz. – Oranges13

+0

Önyükleme yapmak istemiyor musunuz? http://apidock.com/rails/ActiveRecord/AssociationPreload/ClassMethods/preload_associations – toxaq

cevap

2

, her zaman find yöntem geçen deneyebilirsiniz: include: katılır,: vb includes veya joins satır aşağı aynı şeyi yapar nerede veri ama ActiveRecord davranışına erişmeye çalıştığınızda farklı. Örneğin, 3 yoldan sonra nesne dizisini ayarlayın ancak bunlar farklıdır.

[1]

alerts = Alert.joins(:polling) 

[2]

alerts = Alert.includes(:polling) 

[3]

alerts = Alert.find(:all, :includes => :polling, :joins => :polling) 

yapmak

alerts.each do |alert| 
    alert.pollings.each do |polling| 
    p polling 
    end 
end 

activerecord'un DB veya önbellekten veri almaya nasıl çalıştığını görebilirsiniz. [3] yolu, inanıyorum, diğerleri birden çok sorgu attığında sadece bir sorgu atıyor.

+0

Alert.find'i bir birleştirmeyle yapsam bile, alertt.pollings kullanırsam yine de bunları veritabanından ayrı olarak geri çektiğini keşfettim Bu yüzden ek sorguları hala yapmaya neden oluyordu. Ben de bir .select() kullanarak sona erdi ve sadece alertt.polling_field amaçlandığı gibi çalışıyor. Garip ama işe yarıyor. – Oranges13