複数形のテーブルとヘビのケースの列に関してレール構成をオーバーライドする方法


8

したがって、私は、Railsで記述されたバックエンドと、Amplifyを使用してVueで記述されたクライアントがあるアプリを構築しています。私のデータベースはMySQLであり、データソースとしてGraphQLを使用してAWS AppSyncを使用しています(データベースをポイントしています)。

AWS Amplifyには、テーブル名と列に基づいて1つの簡単なコマンドでスキーマを生成できるフレームワークがありますamplify api add-graphql-datasource。しかし、私はRailsマイグレーションを使用しているので、私のデータベースはRailsの規則を使用しています。

ここでの問題は、GraphQLスキーマがすべて醜く、正しい規則を使用していないことです(キャメルケースのプロップを使用した、タイプと入力の単一名)。例:

私のバックエンドには次の移行があります:

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

このために生成されるスキーマは次のとおりです。

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
  // ...
}

これは言うまでもありません:

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

したがって、AWS Amplifyは新しく、Railsほど成熟しておらず、その上、クライアントで問題を処理するためのアダプターやトランスフォーマーが見つかりませんでした...私の希望は、Railsでそれを処理する方法を見つけることです。

移行、関連付け、関連付けの管理方法(create_xxx、build_xxx)など、何も壊さずにRailsの規則を完全に変更できる必要があります。

このアプリは本当に新しいので、すべての移行をゼロから再作成できます。

ありがとう

回答:


1

私はあなたにできることをいくつか見ることができます:

テーブル:

移行ではテーブル名を変更できますが、ここでモデルにテーブル名をで知らせる必要があります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

属性:

t.belongs_toor t.referencesやのようなRailsの規則に従うRailsの移行方法を使用しないようにする必要があり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

関係:

モデルの関係も更新する必要があります

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

詳細については、Rails APIを参照してください他の関係方法のドキュメントを必ず確認してください。

タイムスタンプ:

タイムスタンプ列(created_atupdated_at)はActiveRecordで期待されるものではなくなったためActiveRecord::Timestampモジュールオーバーライドして、期待どおりに機能を継続させる必要がある場合があります。最も簡単なオプションの1つは、ApplicationRecord以下を使用して、または単一のモデルクラスを更新することです。

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

または、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

自動生成された入力

ここでは間違っているかもしれませんが、テーブル名がのようCreate<table>Inputに入力名に挿入されているようです。その場合は、のPost代わりにテーブルに名前を付けることができますpost

input CreatepostsInput {
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.