Cách ghi đè cấu hình đường ray liên quan đến bảng số nhiều và cột vỏ rắn


8

Vì vậy, tôi đang xây dựng một ứng dụng mà tôi có phần phụ trợ được viết bằng Rails và một ứng dụng khách được viết bằng Vue với Amplify. Cơ sở dữ liệu của tôi là MySQL và tôi đang sử dụng AWS AppSync với GraphQL làm nguồn dữ liệu (trỏ đến cơ sở dữ liệu của tôi).

AWS Amplify có một khung cho phép tôi tạo các lược đồ dựa trên các tên bảng và cột bằng một lệnh đơn giản : amplify api add-graphql-datasource. Nhưng bởi vì tôi đang sử dụng di chuyển đường ray, cơ sở dữ liệu của tôi đang sử dụng các quy ước Rails: các bảng số nhiều với các cột có vỏ rắn.

Bây giờ, vấn đề với đó là các lược đồ GraphQL đều xấu và không sử dụng các quy ước chính xác (tên số ít cho các loại và đầu vào, với các đạo cụ vỏ lạc đà). Thí dụ:

Phần cuối của tôi có phần di chuyển sau:

class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.belongs_to :site, null: false
      t.string :title
      t.string :url
      t.text :body

      t.timestamps
    end
  end
end

Và lược đồ được tạo cho điều này là:

type posts {
  id: Int!
  site_id: Int!
  title: String
  url: String
  body: String
  created_at: AWSDateTime!
  updated_at: AWSDateTime!
}

type Query {
  getPosts(id: Int!): posts
  listPostss: [posts]
  // ...
}

schema {
  query: Query
  // ...
}

Không đề cập đến điều này:

input CreatepostsInput {
  id: Int!
  site_id: Int!
  title: String
  url: String
  body: String
  created_at: AWSDateTime!
  updated_at: AWSDateTime!
}

Vì vậy, AWS Amplify là mới, nó chưa trưởng thành như Rails, và trên hết tôi không tìm thấy bất kỳ bộ chuyển đổi hoặc biến áp nào để xử lý sự cố trong máy khách ... hy vọng của tôi là tìm cách xử lý nó trên Rails.

Tôi cần có thể thay đổi hoàn toàn các quy ước Rails mà không vi phạm bất cứ điều gì: di chuyển, liên kết, cách quản lý các hiệp hội (create_xxx, build_xxx).

Ứng dụng này thực sự mới, vì vậy tôi có thể tạo lại tất cả các lần di chuyển từ đầu.

Cảm ơn

Câu trả lời:


1

Tôi có thể thấy một số điều bạn có thể làm:

Những cái bàn:

Trong quá trình di chuyển của bạn, bạn có thể thay đổi tên bảng, nhưng bây giờ bạn cần cho mô hình của mình biết tên bảng là gì self.table_name.

# migration
class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :post do |t| # singular 'post'
      ...
    end
  end
end

#model
class Post
  self.table_name = "post" # i think you can also use a symbol :post
end

Thuộc tính:

Bạn cần tránh sử dụng các phương thức di chuyển Rails tuân theo các quy ước Rails như t.belongs_tohoặc t.referenceshoặc t.timestamps.

# migration
class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :post do |t|
      # do not use this below
      # t.belongs_to :site, null: false
      t.bigint :siteId, null: false
      t.string :title
      t.string :url
      t.text :body

      # do not use this below
      # t.timestamps
      t.datetime :createdAt, default: ->{'CURRENT_TIMESTAMP'}
      t.datetime :updatedAt, default: ->{'CURRENT_TIMESTAMP'}
    end
  end
end

Các mối quan hệ:

Bạn cũng cần cập nhật các mối quan hệ của bạn trong các mô hình của bạn

class Post
  belongs_to :site, foreign_key: 'siteId'
end

Thông tin thêm có thể được tìm thấy trong API Rails . Hãy chắc chắn rằng bạn kiểm tra sự thông thạo cho các phương pháp mối quan hệ khác .

Dấu thời gian:

Vì các cột dấu thời gian ( created_at, updated_at) không còn là cột được ActiveRecord mong đợi nữa, bạn có thể cần ghi đè ActiveRecord::Timestampmô-đun để chúng tiếp tục hoạt động như bạn mong đợi. Một trong những lựa chọn dễ nhất là cập nhật ApplicationRecordmột hoặc một lớp mô hình duy nhất với các mục sau:

class ApplicationRecord # or class Post
  before_create :set_timestamps
  before_save :set_timestamps

  private
  def set_timestamps
    self.createdAt = DateTime.current if self.new_record?
    self.updatedAt = DateTime.now
  end
end

Hoặc tùy chọn khác này được lấy từ https://stackoverflow.com/a/52276865/1845602

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  class << self
    private

    def timestamp_attributes_for_create
      super << 'my_created_at_column'
    end

    def timestamp_attributes_for_update
      super << 'my_updated_at_column'
    end
  end
end

Đầu vào được tạo tự động :

Tôi có thể sai ở đây, nhưng có vẻ như tên bảng đang được thêm vào tên đầu vào như Create<table>Inputvậy, vì vậy nếu đó là trường hợp, bạn có thể đặt tên cho bảng của mình Postthay vì post.

input CreatepostsInput {
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.