学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Rails6.0 | 仕事売買サイトの構築 | 25 | 注文モデル

[24]仕事の表示 << [ホームに戻る] >> [26]注文コントローラとビュー


注文のモデルを作成していきます。
まずは「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



↓↓クリックして頂けると励みになります。


[24]仕事の表示 << [ホームに戻る] >> [26]注文コントローラとビュー