2015-05-16 34 views
17

Ecto ben https://github.com/elixir-lang/ecto/issues/389 okumaya ve ilgili konular ona bağlı olarak polimorfik ilişkiyi destekler niteliktedir.Polimorfik dernek Ecto ile nasıl çalışır?

ı Görev ve Olay modellerinde Yorum modeli ilişki gerek diyelim. özel kaynağıyla Ecto dernek benim anlayış doğru ise, o zaman dört masa ve üç model,

Tablolar

  • görevleri
  • olayları
  • tasks_comments
  • events_comments
gerek

model

  • Görev
  • Olay
  • Yorum

Görev ve Olay modeli aşağıdaki gibi özel kaynağıyla Has_many derneği sahip olacaktır. Anlamadığım şey Şimdi

defmodule ExampleApp.Task do 
    use ExampleApp.Web, :model 

    schema "tasks" do 
    field :title, :string 
    field :body, :string 
    has_many :comments, {"tasks_comments", Comment} 

    timestamps 
    end 
end 

defmodule ExampleApp.Event do 
    use ExampleApp.Web, :model 

    schema "events" do 
    field :title, :string 
    field :body, :string 
    has_many :comments, {"events_comments", Comment} 

    timestamps 
    end 
end 

Comment modeli gibi görünmelidir nasıl?

Yorum model iki tabloyu nasıl işliyor

? ve farklı modellere olan ilişkiyi nasıl ele alır?

cevap

17

Yukarıdaki tasarımı ile gidiş varsa, yorum modeli gerçekten herhangi bir tabloyu yok, onun masa dernek tarafından tanımlanır.

from c in {"events_comments", Comment} 

Bu, bazı durumlarda büyük bir tekniktir ve model ile size değil çift depolama (tablo) sağlar: Yani tüm etkinlikler için tüm yorumlar, yapabileceğin olsun. Aynı modeli farklı tablolar için de kullanabilirsiniz. Eğer tüm yorumları alıp hem olaylar ve görevler ile ilişkilendirmek istiyorsanız

Ancak, o zaman ilişkiler yoluyla kullanabilirsiniz. > "Events_comments" < - - Sen "olayları" < olacak> "yorum" ve "görevler" < -> "tasks_comments" < -> "yorum".

diğer yaklaşım Rails ile polimorfik dernek yapmanın yol ve Yorum modelinde bir "tür" sütunu tanımlı etmektir. Veritabanı referanslarını kırıyor ama bunun üstesinden gelmenin başka bir yolu var.

Ben geribildirim için EKTOPARAZİT konuda dokümanlar sayesinde artıracak!

+0

Jose, cevap için teşekkürler. Cevaplarınızdan kaynaklanan çok sayıda soru var. Belki hepsi bu kadar önemsiz. 1. "Yorum modeli gerçekten herhangi bir tabloyu yok" => şema olmadan Comment modeli çalışır nasıl. 'Schema == table' okuyorum. Şema olmadan Yorum'u nasıl ve nasıl değiştirebilirim? 2. nasıl Ecto birlikte 'raylar yolu' çalışır? örnek kod var mı Bunun desteklediği kaynak kodu veya dokümanları okumayı göremiyorum. – shankardevy

+1

1.Yorum modelinde bir tablo yoktur ancak ilişkilendirme yoluyla oluşturulduğunda bir tane vardır. 'Ve asla'% Comment {} ': Yani sır' assoc (yorum görevi) kullanmaktır. Bunları burada belgeledim: https://github.com/elixir-lang/ecto/commit/1d98ad795b8707ff8a9496657112603c14a64cc2 –

+1

2. Raylar yolu Ecto derneklerinde çalışmaz çünkü veri tabanları referanslarını tutamayacağı için genellikle kötü bir uygulamadır. Sorgularınızı oluşturup uygun alanları elle ayarlamalısınız. –