Skip to content

Commit 674161a

Browse files
authored
IIRR-33: Filter out cloned archived puzzles (#78)
* IIRR-33: Filter out cloned archived puzzles * IIRR-33: make sure without_cloned returns an AR relation instead of array * IIRR-33: Rename clone to clone_puzzle
1 parent 1d472a6 commit 674161a

5 files changed

Lines changed: 40 additions & 5 deletions

File tree

app/controllers/puzzles/clones_controller.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
class Puzzles::ClonesController < ApplicationController
22
def create
33
original_puzzle = Puzzle.find(params[:puzzle_id])
4-
attributes = original_puzzle.attributes.slice("question", "answer", "explanation", "link", "suggested_by")
5-
cloned_puzzle = Puzzle.new(attributes.merge(original_puzzle:, state: params.fetch(:state, "pending")))
4+
cloned_puzzle = original_puzzle.clone_puzzle
65

7-
if cloned_puzzle.save
6+
if cloned_puzzle.persisted?
87
redirect_to puzzles_path, notice: "Puzzle cloned. You can now edit the new puzzle."
98
else
109
redirect_to puzzles_path, alert: "Failed to clone puzzle."

app/controllers/puzzles_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ def index
55
@rejected_puzzles = Puzzle.rejected
66
@archived_puzzles = Puzzle.archived
77
@archived_puzzles = @archived_puzzles.only_low_success_rate if params[:low_success_rate]
8+
@archived_puzzles = @archived_puzzles.without_cloned if params[:hide_cloned_puzzles]
89
end
910

1011
def edit

app/models/puzzle.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,18 @@ def correct_answer_percentage
1818
(correct_count * 100.0 / total).round(1)
1919
end
2020

21+
def clone_puzzle
22+
attrs = attributes.slice("question", "answer", "explanation", "link", "suggested_by")
23+
Puzzle.create(attrs.merge(original_puzzle: self, state: "pending"))
24+
end
25+
2126
def self.only_low_success_rate
22-
includes(:answers).to_a.select { |ans| ans.correct_answer_percentage <= 80 }
27+
low_success_rate_ids = includes(:answers).to_a.select { |ans| ans.correct_answer_percentage <= 80 }.map(&:id)
28+
where(id: low_success_rate_ids)
29+
end
30+
31+
def self.without_cloned
32+
cloned_puzzles_ids = unscoped.where.not(original_puzzle_id: nil).pluck(:original_puzzle_id)
33+
where.not(id: cloned_puzzles_ids)
2334
end
2435
end

app/views/puzzles/index.html.erb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
<section class="filters">
2020
<label>Filters:</label>
2121
<br>
22-
<%= link_to "Show low success rate only", url_for(low_success_rate: true) %>
22+
<%= link_to "Show low success rate only", url_for(low_success_rate: true, hide_cloned_puzzles: params[:hide_cloned_puzzles]) %>
23+
<br>
24+
<%= link_to "Hide cloned puzzles", url_for(hide_cloned_puzzles: true, low_success_rate: params[:low_success_rate]) %>
2325
</section>
2426
<%= render partial: 'puzzles_table', locals: { puzzles: @archived_puzzles, actions: :archived } %>

test/models/puzzle_test.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,26 @@ class PuzzleTest < ActiveSupport::TestCase
5959
assert_includes puzzles, puzzles(:archived_low_rate)
6060
assert_not_includes puzzles, puzzles(:archived_high_rate)
6161
end
62+
63+
test "without_cloned returns puzzles that has not been cloned" do
64+
puzzle1 = puzzles(:one)
65+
puzzle2 = puzzles(:two)
66+
67+
puzzles = Puzzle.without_cloned
68+
assert_includes puzzles, puzzle1
69+
assert_includes puzzles, puzzle2
70+
71+
puzzle3 = puzzle1.clone_puzzle
72+
puzzles = Puzzle.without_cloned
73+
assert_not_includes puzzles, puzzle1
74+
assert_includes puzzles, puzzle2
75+
assert_includes puzzles, puzzle3
76+
77+
puzzle4 = puzzle3.clone_puzzle
78+
puzzles = Puzzle.without_cloned
79+
assert_not_includes puzzles, puzzle1
80+
assert_includes puzzles, puzzle2
81+
assert_not_includes puzzles, puzzle3
82+
assert_includes puzzles, puzzle4
83+
end
6284
end

0 commit comments

Comments
 (0)