2015-12-17 13 views
9

, iki planları oradayız benim içinElixir Phoenix için Denetleyici'de veya Modelde Ecto.Repo kullanmalı mıyım? <a href="http://www.phoenixframework.org/" rel="noreferrer">Phoenix</a> Denetleyicisiyken bazı sorgu için

Planı 1:

defmodule Demo.UserController do 
    # ... 
    def index do 
    # This is just for example 
    # The point is Repo in used here 
    Repo.all(User) 
    end 
end 

Planı 2: Ben Çünkü çoğunda Planı 2. tercih

defmodule Demo.User do 
    # ... 
    def all do 
    # Put all Repo API and building query logic in Model 
    Repo.all(__MODULE__) 
    end 
end 

Durumlarda, Modele veri getirme ile ilgili tüm mantığı koyabiliyorum.

Ama bir daha iyidir (web/web.ex)

Kontrolör yerine Modeli resmi kılavuz kullanım Planı 1 (docs/model) ve Phoenix varsayılan kodu alias Repo bulmak? Ve neden?

cevap

16

Repo çağrılarınızı denetleyicinizin içinde tutmalısınız. Mantığınız karmaşıksa, mantığı kendi servis modülüne aktarmayı düşünmelisiniz.

Model işlevlerinizi yalnızca (etkilerden arındırılmış) saf olarak kullanmalısınız, böylece yalnızca veri üzerinde hareket etmelidirler.

def alphabetical(query) 
    order_by(query, [u], u.name) 
end 

Ama olmamalıdır: Yani örneğin sahip olabilir

def alphabetical(query) 
    order_by(query, [u], u.name) 
    |> Repo.all 
end 

sorguları tamamen veri Bunun nedeni, Repo.all çağrısı böylece (veritabanına gidiyor) yan etkileri vardır senin kontrolörüne ait.

+0

Merhaba, Bu sorun hakkında başka bir sorum var. Repo çağrılarını denetleyiciye koyarsam, modeli nasıl test edebilirim? Örneğiniz gibi, bazı kayıtları eklemek için Repo'yu kullanmalıyım, sonra testi yapın (bir entegrasyon testi gibi görünüyor) veya sadece 'order_by' sonucunu test edin? btw, 'order_by' sonucunu nasıl test edeceğimi bilmiyorum. –

+1

Phoenix Programlama'da geliştiricilerin test/modellerde iki test dosyasına sahip olmalarını öneririz: user_test.exs ve user_repo_test.exs. İlki, değişiklikleri ve depo gerektirmeyen her şeyi test edebilirsiniz. Avantajı, üstte "async: true" ile çalışabilmenizdir. Diğeri depo gerektirir ve karmaşık sorguları test etmek için bir yer olabilir. Her şey ne tür bir test yapmak istediğinize bağlıdır. –

İlgili konular