2016-01-30 21 views
5

Przeszukałem dokumenty, w jaki sposób implementować relacje między podmiotami (np. Jeden do wielu, wiele do wielu itd.), Ale nie znaleziono dowolne przykłady.Wdrażanie wielu do wielu (i innych) relacji z Hanami

Więc spróbowałem rozsądnego odgadnięcia. Oto moja próba wdrożenie Person który może być oznaczony Tag s:

require 'moocho_query' 
require 'hanami/model' 
require 'hanami/model/adapters/file_system_adapter' 

class Person 
    include Hanami::Entity 
    attributes :name, :age, :tags 
end 

class Tag 
    include Hanami::Entity 
    attributes :name 
end 

class PersonRepository 
    include Hanami::Repository 
end 

class TagRepository 
    include Hanami::Repository 
end 

Hanami::Model.configure do 

    adapter type: :file_system, uri: './file_db' 

    mapping do 

    collection :people do 
     entity Person 
     repository PersonRepository 

     attribute :id, Integer 
     attribute :name, String 
     attribute :age, Integer 
     attribute :tags, type: Array[Tag] 
    end 

    collection :tags do 
     entity Tag 
     repository TagRepository 

     attribute :id, Integer 
     attribute :name, String 
    end 

    end 

end.load! 


me = Person.new(name: 'Jonah', age: 99) 
t1 = Tag.new(name: 'programmer') 
t2 = Tag.new(name: 'nice') 
me.tags = [t1, t2] 
PersonRepository.create(me) 

To nie na wezwanie load!, z powodu następującego błędu:

/Users/x/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/hanami-utils-0.7.0/lib/hanami/utils/class.rb:90:in `load_from_pattern!': uninitialized constant (Hanami::Model::Mapping::Coercers::{:type=>[Tag]}| 
{:type=>[Tag]}) (NameError) 
     from /Users/jg/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/hanami-model-0.6.0/lib/hanami/model/mapping/attribute.rb:80:in `coercer' 
     from /Users/jg/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/hanami-model-0.6.0/lib/hanami/model/mapping/attribute.rb:53:in `load_coercer' 

Jaki jest prawidłowy sposób wdrożyć relacje w Hanami?

Odpowiedz

3

Począwszy od wersji 0.7.0, nie ma sposobu na wdrożenie relacji między jednostkami. Dlatego też w dokumentacji nie ma instrukcji.

Z ciekawości zapytałem o to przy pomocy tweet, które można uznać za oficjalne słowo na temat relacji z jednostkami.

Jako obiekt do wykonania w obiektach Hanami obiekty są po prostu obiektami, które utrwalają się w bazie danych, co oznacza, że ​​szczegóły dotyczące trwałości obiektu mogą się różnić w zależności od jego schematu.

Sugerowałbym posiadanie metody tags na obiekcie Person. Wewnątrz tej metody możesz odzyskać tagi osoby. Coś takiego:

def self.tags 
    TagRepository.query do 
    where(id: [tag-id-1, tag-id-2, ... , tag-id-n]) 
    end.all 
end 

Chociaż trzeba będzie utrzymywać identyfikatory tagów związanych z osobą, do bazy danych jako atrybut osoby lub za pomocą sprzężenia tabeli.

Czy wiesz, że ta implementacja będzie mieć problem z zapytaniem n+1.

+0

Dzięki za informacje. Czy znasz jakieś inne klejnoty ruby, które implementują wzór repozytorium z wymiennymi adapterami dla plików/pamięci/postgresów takich jak Hanami, ale także mają wsparcie dla stowarzyszeń? – Jonah

0

od Hanami 0.9.0, istnieje pierwsze wsparcie dla stowarzyszeń. Pierwszy to jeden do wielu. Sprawdź to i sprawdź, czy ma to dla ciebie sens. Dzięki

Powiązane problemy