在我的 rails(版本 6.1.3.2)應用程式中,我有 2 個資料庫:
- 主要,適用于大多數型號
- api_logs, for
ApiLogmodel 而我的database.yml樣子:
development:
primary:
<<: *default
database: <%= ENV["DB_NAME"] || 'jspro_development' %>
host: <%= ENV["DB_HOST"] || 'localhost' %>
username: <%= ENV["DB_USERNAME"] || 'postgres' %>
password: <%= ENV["DB_PASSWORD"] || 'postgres' %>
port: <%= ENV["DB_PORT"] || '5432' %>
api_logs:
<<: *default
database: <%= ENV["API_LOGS_DB_NAME"] || 'api_logs_development' %>
host: <%= ENV["API_LOGS_DB_HOST"] || 'localhost' %>
username: <%= ENV["API_LOGS_DB_USERNAME"] || 'postgres' %>
password: <%= ENV["API_LOGS_DB_PASSWORD"] || 'postgres' %>
port: <%= ENV["API_LOGS_DB_PORT"] || '5432' %>
migrations_paths: db/api_logs
我的ApiLog模型具有以下遷移:
class CreateApiLogs < ActiveRecord::Migration[6.1]
def change
create_table :api_logs do |t|
t.timestamps
t.string :method
t.string :path
t.string :query_string
t.json :headers, default: {}
t.json :request_body, default: {}
t.string :remote_address
t.string :http_origin
t.integer :response_status
t.string :http_user_agent
t.string :http_referer
t.integer :user_id
t.integer :account_id
t.string :membership_type
t.string :unique_id
end
end
end
資料庫已成功創建和遷移。在我app/models/api_log.rb的宣告中,我有以下宣告:
# frozen_string_literal: true
class ApiLog < ApplicationRecord
self.table_name = 'api_logs'
self.abstract_class = true
connects_to database: { writing: :api_logs, reading: :api_logs }
end
有了這個,我就可以運行讀取查詢,如:
irb(main):002:0> ApiLog.first
ApiLog Load (1.6ms) SELECT "api_logs".* FROM "api_logs" ORDER BY "api_logs"."id" ASC LIMIT $1 [["LIMIT", 1]]
=> nil
irb(main):003:0> ApiLog.count
(2.1ms) SELECT COUNT(*) FROM "api_logs"
=> 0
他們很好。
但是當我嘗試創建一個時:
irb(main):003:0> ApiLog.count
(2.1ms) SELECT COUNT(*) FROM "api_logs"
=> 0
irb(main):004:0> ApiLog.create(method: 'POST', user_id: 61)
Traceback (most recent call last):
1: from (irb):4
NotImplementedError (ApiLog is an abstract class and cannot be instantiated.)
我理解錯誤是因為模型中的宣告而抱怨這是一個抽象類。但是,如果我洗掉self.abstract_class=true,甚至ApiLog.count不再起作用:
irb(main):001:0> ApiLog.count
Traceback (most recent call last):
3: from (irb):1
2: from app/models/api_log.rb:3:in `<main>'
1: from app/models/api_log.rb:7:in `<class:ApiLog>'
NotImplementedError (`connects_to` can only be called on ActiveRecord::Base or abstract classes)
我遵循了Rails 指南,但它沒有看到作業,即使讀取查詢很好。
那么如何api_logs在新資料庫中創建物件呢?
謝謝!
uj5u.com熱心網友回復:
從 Rails 指南:
你的問題是你試圖讓一個單一的類既充當你的模型又充當指南所說的連接模型。
在單個模型中連接到您的資料庫,然后從該模型繼承表而不是將多個單獨的模型連接到同一個資料庫,這一點很重要。
我相信你只需要將你所擁有的分為兩個模型:
class LogRecord < ApplicationRecord
self.table_name = 'api_logs'
self.abstract_class = true
connects_to database: { writing: :api_logs, reading: :api_logs }
end
class ApiLog < LogRecord
...
end
讀取查詢似乎按照您的方式作業的唯一原因是您沒有任何匹配的記錄,因此結果是nil. 如果存在現有記錄,您將收到與 create 相同的錯誤,因為此問題與 SQL 查詢無關,而是與您的類的結果實體化有關。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/370151.html
下一篇:Ruby陣列的餅圖
