10

ile polimorfik ilişkiyi içerir. Polimorfik ilişki ile çalışırken, yalnızca bazı türlerde bulunan alt modellere dahil olan bir özelliği çalıştırmak mümkün müdür?Ruby On Rails:: alt model

Örnek:

ben böyle bir şey yapmak istiyorum gidiyorum görünümünde
class Container 
    belongs_to :contents, :polymorphic => true 
end 
class Food 
    has_one :container 
    belongs_to :expiration 
end 
class Things 
    has_one :container 
end 

: Dolayısıyla

<% c = Containers.all %> 
<% if c.class == Food %> 
    <%= food.expiration %> 
<% end %> 

, ben hevesli yük ı c yüklemek sona ermesini istiyorum Çünkü biliyorum ki son her birine ihtiyacım olacak. Bunu yapmanın bir yolu var mı? Sadece bir düzenli tanımlamak: dahil bana hataları alır çünkü tüm kapalı tiplerin bir alt model son kullanma tarihi yoktur.

cevap

24

Düzenlenen Cevap

Geçenlerde sen polimorfik türü sütununda göre filtreleme zaman Raylar polimorfik derneklerin istekli yükleme destekler öğrendim. Yani sahte çağrışımları bildirmeye gerek yok.

class Container 
    belongs_to :content, :polymorphic => true 
end 

Şimdi container_type tarafından Container sorgulamak. Bir sorguda polimorfik nesneleri dahil etmek doğrudan bir yolu olmadığı için

containers_with_food = Container.find_all_by_content_type("Food", 
          :include => :content) 

containers_with_thing = Container.find_all_by_content_type("Thing", 
          :include => :content) 

Eski Cevap

Bu kesmek.

class Container 
    belongs_to :contents, :polymorphic => true 
    # add dummy associations for all the contents. 
    # this association should not be used directly 
    belongs_to :food 
    belongs_to :thing 
end 

Şimdi container_type tarafından Container sorgulamak. Eğer farklı bir sütunu ihtiyaç gibi bir SQL Bunu yapmanın bir yolu yoktur

containers_with_food = Container.find_all_by_content_type("Food", 
          :include => :food) 

containers_with_thing = Container.find_all_by_content_type("Thing", 
          :include => :thing) 

iki SQL sonuçları veritabanına aramaları That (raylar her :include için bir SQL yürütür gibi aslında 4 çağrılar ise) farklı içerik türleri için ayarlanmış.

Sıkıştırma:Content sınıfındaki kukla ilişkilendirmeler, beklenmedik sonuçlarla sonuçlanacağı için doğrudan kullanılmamalıdır.

E.g: contents tablosundaki ilk nesnenin yemek içerdiğini söyleyelim.

Content.first.food # will work 
Content.first.thing 

İkinci arama çalışmaz. Content işaretli Food nesnesiyle aynı kimliğe sahip Thing nesnesini verebilir.

+0

Cevabımı yeni bilgilere dayanarak güncelledim, bir göz atın. –

+1

ActiveRecord hangi sürümünde polimorfik ilişkilerin istekli yüklemesi çalışıyor? Bu benim için çalışmıyor 3.2.3 – nicholaides

+0

@nicholaides Bu 3.2.3 çalışmalıdır. İstekli yükleme sadece polimorfik tip sütununa göre filtrelendiğinizde olur. Karşılaştığınız hata nedir? –