注文のモデルを作成していきます。
まずは「uuid」を使えるように設定します。
コマンド
rails generate migration enable_pgcrypto_extension
作成された「db\migrate\20200526015502_enable_pgcrypto_extension.rb」ファイルを以下のように編集します。
記述編集 db\migrate\20200526015502_enable_pgcrypto_extension.rb
3行目に「enable_extension 'pgcrypto'」の記述を追加しています。
class EnablePgcryptoExtension < ActiveRecord::Migration[6.0] def change enable_extension 'pgcrypto' end end
注文モデルを作成します。
コマンド
一文です。
rails g model Order due_date:date title amount:float status:bigint seller_name buyer_name gig:references buyer:references seller:references --no-test-framework
「db\migrate\20200526020610_create_orders.rb」ファイルを以下のように編集します。
記述編集 db\migrate\20200526020610_create_orders.rb
内容を大幅に変えていますのでコードをコピーしてファイルを置き換えてください。
class CreateOrders < ActiveRecord::Migration[6.0] def change create_table :orders, id: :uuid do |t| t.date :due_date t.string :title t.float :amount t.bigint :status, default: 0 t.string :seller_name t.string :buyer_name t.references :gig, null: true, foreign_key: true t.references :buyer, foreign_key: { to_table: :users } t.references :seller, foreign_key: { to_table: :users } t.timestamps end end end
コマンド マイグレーション適用
rails db:migrate
「app\models\order.rb」ファイルを以下のように編集します。
記述編集 app\models\order.rb
class Order < ApplicationRecord belongs_to :gig, required: false belongs_to :buyer, class_name: "User" belongs_to :seller, class_name: "User" enum status: [:inprogress, :completed] end
「app\models\gig.rb」ファイルに以下の記述を追加します。
記述追加 app\models\gig.rb(7行目)
has_many :orders
app\models\gig.rb
class Gig < ApplicationRecord belongs_to :user belongs_to :category has_many :pricings has_many :orders has_many_attached :photos has_rich_text :description accepts_nested_attributes_for :pricings validates :title, presence: { message: '空白にはできません' } end
「app\models\user.rb」ファイルに以下の記述を追加します。
記述追加 app\models\user.rb(4行目)
has_many :buying_orders, foreign_key: "buyer_id", class_name: "Order" has_many :selling_orders, foreign_key: "seller_id", class_name: "Order"
app\models\user.rb
class User < ApplicationRecord has_many :gigs has_many :buying_orders, foreign_key: "buyer_id", class_name: "Order" has_many :selling_orders, foreign_key: "seller_id", class_name: "Order" has_one_attached :avatar # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :omniauthable, :confirmable validates :full_name, presence: true, length: {maximum: 50} def self.from_omniauth(auth) user = User.where(email: auth.info.email).first if user if !user.provider user.update(uid: auth.uid, provider: auth.provider, image: auth.info.image) end return user else where(provider: auth.provider, uid: auth.uid).first_or_create do |user| user.email = auth.info.email user.password = Devise.friendly_token[0, 20] user.full_name = auth.info.name # ユーザーモデルに名前があると仮定 user.image = auth.info.image # ユーザーモデルに画像があると仮定 user.uid = auth.uid user.provider = auth.provider end end end end