グカネータ作成 / テスト型バグ修正 (#41) #363

マージ済み
みてるぞ が 15 個のコミットを feature/041 から main へマージ 2026-06-10 23:43:51 +09:00
4個のファイルの変更28行の追加28行の削除
コミット 480a06caaf の変更だけを表示してゐます - すべてのコミットを表示
+12 -4
ファイルの表示
@@ -27,12 +27,11 @@ class GekanatorGamesController < ApplicationController
game = GekanatorGame.find_by(id: params[:id])
return head :not_found unless game
asked_ids = Array(game.answers).filter_map { |answer|
answer['questionId'] || answer[:questionId]
}
asked_ids = Array(game.answers).filter_map { |answer| answer_question_id(answer) }
existing_example_ids =
GekanatorQuestionExample.where(post_id: game.correct_post_id)
.select(:gekanator_question_id)
# Direct examples only for now; post_similarity-based expansion is deferred.
questions =
GekanatorQuestion
.accepted
@@ -64,7 +63,7 @@ class GekanatorGamesController < ApplicationController
answers = answer_params.map { |answer|
{
question_id: answer.require(:question_id),
question_id: answer.require(:question_id).to_i,
answer: answer.require(:answer)
}
}
@@ -107,4 +106,13 @@ class GekanatorGamesController < ApplicationController
priority_weight: question.priority_weight
}
end
def answer_question_id answer
value = if answer.is_a?(Hash)
answer['question_id'].presence || answer[:question_id].presence ||
answer['questionId'].presence || answer[:questionId].presence
end
value&.to_s
end
end
+1
ファイルの表示
@@ -10,6 +10,7 @@ module Gekanator
def call
suggestion.with_lock do
return promoted_question if suggestion.processed?
return suggestion if suggestion.answer == 'unknown'
question = GekanatorQuestion.create!(
text: suggestion.question_text,
生成ファイル
-19
ファイルの表示
@@ -208,19 +208,6 @@ ActiveRecord::Schema[8.0].define(version: 2026_06_10_000000) do
t.index ["target_post_id"], name: "index_post_similarities_on_target_post_id"
end
create_table "post_tag_sections", primary_key: ["post_id", "tag_id", "begin_ms"], charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.bigint "post_id", null: false
t.bigint "tag_id", null: false
t.integer "begin_ms", null: false
t.integer "end_ms", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["post_id", "begin_ms"], name: "idx_post_tag_sections_post_id_begin_ms"
t.index ["tag_id"], name: "fk_rails_8be3847903"
t.check_constraint "`begin_ms` < `end_ms`", name: "chk_post_tag_sections_end_ms_after_begin_ms"
t.check_constraint "`begin_ms` >= 0", name: "chk_post_tag_sections_begin_ms_natural"
end
create_table "post_tags", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.bigint "post_id", null: false
t.bigint "tag_id", null: false
@@ -271,11 +258,8 @@ ActiveRecord::Schema[8.0].define(version: 2026_06_10_000000) do
t.datetime "original_created_before"
t.datetime "updated_at", null: false
t.integer "version_no", null: false
t.integer "video_ms"
t.index ["uploaded_user_id"], name: "index_posts_on_uploaded_user_id"
t.index ["url"], name: "index_posts_on_url", unique: true
t.index ["video_ms", "id"], name: "idx_posts_video_ms_id"
t.check_constraint "(`video_ms` is null) or (`video_ms` > 0)", name: "chk_posts_video_ms_positive"
t.check_constraint "`version_no` > 0", name: "chk_posts_version_no_positive"
end
@@ -426,7 +410,6 @@ ActiveRecord::Schema[8.0].define(version: 2026_06_10_000000) do
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["expires_at"], name: "index_theatre_watching_users_on_expires_at"
t.index ["theatre_id", "expires_at"], name: "idx_on_theatre_id_skip_expires_at_4c8de1dd42"
t.index ["theatre_id", "expires_at"], name: "index_theatre_watching_users_on_theatre_id_and_expires_at"
t.index ["theatre_id"], name: "index_theatre_watching_users_on_theatre_id"
t.index ["user_id"], name: "index_theatre_watching_users_on_user_id"
@@ -595,8 +578,6 @@ ActiveRecord::Schema[8.0].define(version: 2026_06_10_000000) do
add_foreign_key "post_implications", "posts", column: "parent_post_id"
add_foreign_key "post_similarities", "posts"
add_foreign_key "post_similarities", "posts", column: "target_post_id"
add_foreign_key "post_tag_sections", "posts"
add_foreign_key "post_tag_sections", "tags"
add_foreign_key "post_tags", "posts"
add_foreign_key "post_tags", "tags"
add_foreign_key "post_tags", "users", column: "created_user_id"
+15 -5
ファイルの表示
@@ -449,9 +449,12 @@ const previewAnswer = ({
const hardFilteredPosts =
answer === 'unknown'
? posts
: posts.filter (post => expectedAnswerForQuestion (question, post) === answer)
: posts.filter (post => {
const expected = expectedAnswerForQuestion (question, post)
return expected === null || expected === 'unknown' || expected === answer
})
const nextPosts =
answer !== 'unknown' && hardFilteredPosts.length > 0
hardFilteredPosts.length > 0
? hardFilteredPosts
: posts
const nextScores = new Map (scores)
@@ -1061,14 +1064,16 @@ const GekanatorPage: FC = () => {
}})
const questionSuggestionMutation = useMutation ({
mutationFn: saveGekanatorQuestionSuggestion,
onSuccess: data => {
onSuccess: async data => {
await queryClient.refetchQueries ({ queryKey: gekanatorKeys.questions () })
setQuestionSuggestionCount (data.count)
setQuestionSuggestion ('')
setQuestionSuggestionAnswer ('yes')
}})
const extraQuestionAnswersMutation = useMutation ({
mutationFn: saveGekanatorExtraQuestionAnswers,
onSuccess: () => {
onSuccess: async () => {
await queryClient.refetchQueries ({ queryKey: gekanatorKeys.questions () })
setExtraQuestionState ('saved')
setPhase ('learned')
}})
@@ -1544,7 +1549,12 @@ const GekanatorPage: FC = () => {
? <>wwwww <ruby>鹿<rt></rt></ruby>!</>
: <><ruby>鹿<rt></rt></ruby>稿</>
const introLoading = isLoading || acceptedQuestionsLoading
const readyToStart = !(introLoading) && acceptedQuestionsFetched && posts.length > 0
const readyToStart =
!(introLoading)
&& acceptedQuestionsFetched
&& posts.length > 0
&& !(error)
&& !(acceptedQuestionsError)
return (
<MainArea className="bg-yellow-50 dark:bg-red-975">