2016-01-30 20 views
5

Tôi đã tìm kiếm tài liệu về cách triển khai mối quan hệ giữa các thực thể (ví dụ: một, nhiều, nhiều người, v.v.) nhưng không tìm thấy bất kỳ ví dụ nào.Thực hiện mối quan hệ nhiều và nhiều (và khác) với Hanami

Vì vậy, tôi đã thử một dự đoán hợp lý. Đây là nỗ lực của tôi lúc thực hiện một Person những người có thể được gắn thẻ với 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) 

này thất bại trên load! cuộc gọi, với các lỗi sau:

/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' 

là gì cách chính xác để thực hiện các mối quan hệ trong Hanami?

Trả lời

3

Kể từ phiên bản 0.7.0, không có cách nào để triển khai mối quan hệ giữa các thực thể. Đây là lý do tại sao không có cách thực hiện trong tài liệu.

Trong sự tò mò, tôi đã hỏi điều này bằng cách sử dụng tweet có thể được coi là từ chính thức về các mối quan hệ thực thể.

Là một công việc xung quanh, trong Hanami, các thực thể đơn giản là các đối tượng mà bạn đang lưu giữ cơ sở dữ liệu, có nghĩa là chi tiết về sự tồn tại của thực thể có thể khác với lược đồ của nó.

Tôi khuyên bạn nên có phương pháp tags trên đối tượng Person. Bên trong phương thức này, bạn có thể truy xuất thẻ của người đó. Một cái gì đó như thế này:

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

Mặc dù bạn sẽ cần phải duy trì id thẻ được liên kết với người đó vào cơ sở dữ liệu làm thuộc tính của người đó hoặc sử dụng bảng tham gia.

Bạn biết rằng việc triển khai này sẽ có sự cố truy vấn n+1.

+0

Cảm ơn thông tin. Bạn có biết về bất kỳ loại đá quý ruby ​​nào khác có triển khai mẫu kho lưu trữ với bộ điều hợp có thể hoán đổi cho tệp/bộ nhớ/postgres như Hanami không, nhưng cũng có hỗ trợ cho các liên kết? – Jonah

0

kể từ Hanami 0.9.0, có hỗ trợ ban đầu cho các liên kết. Người đầu tiên là một-nhiều. Vui lòng kiểm tra xem nó có hợp lý với bạn hay không. Cảm ơn

Các vấn đề liên quan