gpt4 book ai didi

hanami - 与 Hanami 实现多对多(和其他)关系

转载 作者:行者123 更新时间:2023-12-04 19:02:16 26 4
gpt4 key购买 nike

我搜索了文档以了解如何实现实体之间的关系(例如,一对多、多对多等),但没有找到任何示例。

所以我尝试了一个合理的猜测。这是我实现 Person 的尝试谁可以被标记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)

这在 load! 上失败了调用,出现以下错误:
/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'

在 Hanami 中实现关系的正确方法是什么?

最佳答案

从 0.7.0 版本开始,无法实现实体之间的关系。这就是为什么文档中也没有操作方法的原因。

出于好奇,我使用 tweet 询问了这个问题。这可以作为实体关系的官方用语。

作为一种变通方法,在 Hanami 中,实体只是您要持久化到数据库的对象,这意味着实体的持久性细节可能与其架构不同。

我建议有一个 tags Person上的方法目的。在此方法中,您可以检索此人的标签。像这样的东西:

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

尽管您需要将与此人关联的标签 ID 作为此人的属性或使用连接表保存到数据库中。

要知道此实现将具有 n+1查询问题。

关于hanami - 与 Hanami 实现多对多(和其他)关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35104214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com