このコミットが含まれているのは:
@@ -0,0 +1,17 @@
|
|||||||
|
class DeerjikistsController < ApplicationController
|
||||||
|
def show
|
||||||
|
platform = params[:platform].to_s.strip
|
||||||
|
code = params[:code].to_s.strip
|
||||||
|
return head :bad_request if platform.blank? || code.blank?
|
||||||
|
|
||||||
|
deerjikist = Deerjikist
|
||||||
|
.joins(:tag)
|
||||||
|
.includes(:tag, tag: :tag_name)
|
||||||
|
.find_by(platform:, code:)
|
||||||
|
if deerjikist
|
||||||
|
render json: DeerjikistRepr.base(deerjikist)
|
||||||
|
else
|
||||||
|
head :not_found
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -86,6 +86,27 @@ class TagsController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def deerjikists
|
||||||
|
tag = Tag.joins(:tag_name)
|
||||||
|
.includes(:tag_name, tag_name: :wiki_page)
|
||||||
|
.find_by(id: params[:id])
|
||||||
|
return head :bad_request unless tag
|
||||||
|
|
||||||
|
render json: DeerjikistRepr.many(tag.deerjikists)
|
||||||
|
end
|
||||||
|
|
||||||
|
def deerjikists_by_name
|
||||||
|
name = params[:name].to_s.strip
|
||||||
|
return head :bad_request if name.blank?
|
||||||
|
|
||||||
|
tag = Tag.joins(:tag_name)
|
||||||
|
.includes(:tag_name, tag_name: :wiki_page)
|
||||||
|
.find_by(tag_names: { name: })
|
||||||
|
return head :not_found unless tag
|
||||||
|
|
||||||
|
render json: DeerjikistRepr.many(tag.deerjikists)
|
||||||
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
return head :unauthorized unless current_user
|
return head :unauthorized unless current_user
|
||||||
return head :forbidden unless current_user.member?
|
return head :forbidden unless current_user.member?
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
class Deerjikist < ApplicationRecord
|
||||||
|
self.primary_key = :platform, :code
|
||||||
|
|
||||||
|
belongs_to :tag
|
||||||
|
|
||||||
|
validates :platform, presence: true
|
||||||
|
validates :code, presence: true
|
||||||
|
validates :tag_id, presence: true
|
||||||
|
|
||||||
|
validate :tag_must_be_deerjikist
|
||||||
|
|
||||||
|
enum :platform, nico: 'nico', youtube: 'youtube'
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def tag_must_be_deerjikist
|
||||||
|
if tag && !(tag.deerjikist?)
|
||||||
|
errors.add :tag, 'タグはニジラー・カテゴリである必要があります.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -24,6 +24,8 @@ class Tag < ApplicationRecord
|
|||||||
|
|
||||||
has_many :tag_similarities, dependent: :delete_all
|
has_many :tag_similarities, dependent: :delete_all
|
||||||
|
|
||||||
|
has_many :deerjikists, dependent: :delete_all
|
||||||
|
|
||||||
belongs_to :tag_name
|
belongs_to :tag_name
|
||||||
delegate :wiki_page, to: :tag_name
|
delegate :wiki_page, to: :tag_name
|
||||||
|
|
||||||
@@ -42,6 +44,7 @@ class Tag < ApplicationRecord
|
|||||||
|
|
||||||
validate :nico_tag_name_must_start_with_nico
|
validate :nico_tag_name_must_start_with_nico
|
||||||
validate :tag_name_must_be_canonical
|
validate :tag_name_must_be_canonical
|
||||||
|
validate :category_must_be_deerjikist_with_deerjikists
|
||||||
|
|
||||||
scope :nico_tags, -> { where(category: :nico) }
|
scope :nico_tags, -> { where(category: :nico) }
|
||||||
|
|
||||||
@@ -149,4 +152,10 @@ class Tag < ApplicationRecord
|
|||||||
errors.add :tag_name, 'tag_names へは実体を示す必要があります.'
|
errors.add :tag_name, 'tag_names へは実体を示す必要があります.'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def category_must_be_deerjikist_with_deerjikists
|
||||||
|
if !(deerjikist?) && deerjikists.exists?
|
||||||
|
errors.add :category, 'ニジラーと紐づいてゐるタグはニジラー・カテゴリである必要があります.'
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
|
||||||
|
module DeerjikistRepr
|
||||||
|
BASE = { only: [:platform, :code], include: { tag: TagRepr::BASE } }.freeze
|
||||||
|
|
||||||
|
module_function
|
||||||
|
|
||||||
|
def base deerjikist
|
||||||
|
deerjikist.as_json(BASE)
|
||||||
|
end
|
||||||
|
|
||||||
|
def many deerjikists
|
||||||
|
deerjikists.map { |d| base(d) }
|
||||||
|
end
|
||||||
|
end
|
||||||
+17
-1
@@ -9,7 +9,15 @@ Rails.application.routes.draw do
|
|||||||
resources :tags, only: [:index, :show, :update] do
|
resources :tags, only: [:index, :show, :update] do
|
||||||
collection do
|
collection do
|
||||||
get :autocomplete
|
get :autocomplete
|
||||||
get 'name/:name', action: :show_by_name
|
|
||||||
|
scope :name do
|
||||||
|
get ':name/deerjikists', action: :deerjikists_by_name
|
||||||
|
get ':name', action: :show_by_name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
member do
|
||||||
|
get :deerjikists
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -54,4 +62,12 @@ Rails.application.routes.draw do
|
|||||||
post 'code/renew', action: :renew
|
post 'code/renew', action: :renew
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
resources :deerjikists, only: [] do
|
||||||
|
collection do
|
||||||
|
get ':platform/:code', action: :show
|
||||||
|
put ':platfrom/:code', action: :update
|
||||||
|
delete ':platform/:code', action: :destroy
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
class CreateDeerjikists < ActiveRecord::Migration[8.0]
|
||||||
|
def change
|
||||||
|
create_table :deerjikists, primary_key: [:platform, :code] do |t|
|
||||||
|
t.string :platform, null: false, limit: 16
|
||||||
|
t.string :code, null: false
|
||||||
|
t.references :tag, null: false
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
生成ファイル
+10
-1
@@ -10,7 +10,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[8.0].define(version: 2026_01_27_005300) do
|
ActiveRecord::Schema[8.0].define(version: 2026_03_03_122700) do
|
||||||
create_table "active_storage_attachments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
create_table "active_storage_attachments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
||||||
t.string "name", null: false
|
t.string "name", null: false
|
||||||
t.string "record_type", null: false
|
t.string "record_type", null: false
|
||||||
@@ -39,6 +39,15 @@ ActiveRecord::Schema[8.0].define(version: 2026_01_27_005300) do
|
|||||||
t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
|
t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table "deerjikists", primary_key: ["platform", "code"], charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
||||||
|
t.string "platform", limit: 16, null: false
|
||||||
|
t.string "code", null: false
|
||||||
|
t.bigint "tag_id", null: false
|
||||||
|
t.datetime "created_at", null: false
|
||||||
|
t.datetime "updated_at", null: false
|
||||||
|
t.index ["tag_id"], name: "index_deerjikists_on_tag_id"
|
||||||
|
end
|
||||||
|
|
||||||
create_table "ip_addresses", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
create_table "ip_addresses", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
||||||
t.binary "ip_address", limit: 16, null: false
|
t.binary "ip_address", limit: 16, null: false
|
||||||
t.boolean "banned", default: false, null: false
|
t.boolean "banned", default: false, null: false
|
||||||
|
|||||||
新しい課題から参照
ユーザをブロックする