gpt4 book ai didi

ruby - hanami-model 集成到 ruby​​ 项目

转载 作者:行者123 更新时间:2023-12-04 17:39:14 24 4
gpt4 key购买 nike

我的应用程序结构:

.
├── config
│   ├── boot.rb
│   └── environment.rb
├── Gemfile
├── Gemfile.lock
├── lib
│   ├── entities
│   │   └── account.rb
│   └── repositories
│   └── account_repository.rb
└── README.md

gem 文件:

source 'https://rubygems.org'

gem 'pg', '~> 1.1'
gem 'dotenv'
gem 'byebug'
gem 'hanami-model'

配置/环境.rb:

require 'bundler/setup'
require 'hanami/model'
require 'dotenv/load'

class App
class << self
def boot
Mutex.new.synchronize do
Hanami::Model.configure do
adapter :sql, ENV['DATABASE_URL']
end.load!
end
end
end
end

配置/boot.rb:

require_relative './environment'
App.boot

lib/entities/account.rb:

require 'hanami/model'
require_relative '../repositories/account_repository'

class Account < Hanami::Entity
end

lib/repositories/account_repository.rb:

require 'hanami/model'
require_relative '../entities/account'

class AccountRepository < Hanami::Repository
self.relation = :accounts
end

在控制台中,我运行以下代码,但出现错误:

irb -I .
irb(main):001:0> require 'config/boot'
=> true
irb(main):002:0> require 'lib/repositories/account_repository'
=> true
irb(main):003:0> rep = AccountRepository.new
Traceback (most recent call last):
6: from /home/mvalitov/.asdf/installs/ruby/2.5.1/bin/irb:11:in `<main>'
5: from (irb):3
4: from (irb):3:in `new'
3: from /home/mvalitov/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/hanami-model-1.3.2/lib/hanami/repository.rb:420:in `initialize'
2: from /home/mvalitov/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/rom-repository-1.4.0/lib/rom/repository/root.rb:62:in `initialize'
1: from /home/mvalitov/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/rom-3.3.3/lib/rom/registry.rb:30:in `fetch'
ArgumentError (key cannot be nil)

我做错了什么?如果将所有实体代码和存储库放在一个文件中,代码运行时不会出错。

最佳答案

问题是按加载顺序。

这里是文档中关于严格顺序的注释:

When using a sql adapter, you must require hanami/model/sql before Hanami::Model.load! is called so the relations are loaded correctly.

来源:https://github.com/hanami/model#mapping

因此,对于您的情况,需要在所有声明之后运行 App.boot

详细信息:

如果将所有代码放入一个文件中,您将看到不同之处:

# run.rb
require 'bundler/setup'
require 'hanami/model'
require 'dotenv/load'
class App
class << self
def boot
Mutex.new.synchronize do
Hanami::Model.configure do
adapter :sql, 'postgresql://postgres:12345@localhost:5432/mame-challenge_development'
path '/home/mifrill/Documents/source/hamani-bug'
end.load!
end
end
end
end
App.boot
class AccountRepository < Hanami::Repository
self.relation = :accounts
end
class Account < Hanami::Entity
end
AccountRepository.new

ruby run.rb

gems/rom-3.3.3/lib/rom/registry.rb:30:in `fetch': key cannot be nil (ArgumentError)

App.boot 移到 Repository 和 Entity 定义之后,如下所示:

require 'bundler/setup'
require 'hanami/model'
require 'dotenv/load'
class App
class << self
def boot
Mutex.new.synchronize do
Hanami::Model.configure do
adapter :sql, 'postgresql://postgres:12345@localhost:5432/mame-challenge_development'
path '/home/mifrill/Documents/source/hamani-bug'
end.load!
end
end
end
end
class AccountRepository < Hanami::Repository
self.relation = :accounts
end
class Account < Hanami::Entity
end
App.boot
AccountRepository.new

ruby run.rb

{:accounts=>#<ROM::Relation[Accounts] name=accounts dataset=#<Sequel::Postgres::Dataset: "SELECT * FROM \"accounts\"">>

所以,尝试在 load! 之前 require Repository 文件来解决:

config/boot.rb:

require_relative './environment'
require_relative '../lib/repositories/account_repository'
App.boot
irb -I .
require 'config/boot'
rep = AccountRepository.new
...
{:accounts=>#<ROM::Relation[Accounts] name=accounts dataset=#<Sequel::Postgres::Dataset: "SELECT * FROM \"accounts\"">>}

关于ruby - hanami-model 集成到 ruby​​ 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55299444/

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