From 4e91c89153747bce7bed848a758081c6affd9188 Mon Sep 17 00:00:00 2001 From: cryptogopher Date: Tue, 9 Jan 2024 00:11:26 +0100 Subject: [PATCH] List units ordered, not using nested_set --- app/models/unit.rb | 13 ++++++++----- app/models/user.rb | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/models/unit.rb b/app/models/unit.rb index 7a4877e..03e6f0b 100644 --- a/app/models/unit.rb +++ b/app/models/unit.rb @@ -14,11 +14,14 @@ class Unit < ApplicationRecord acts_as_nested_set parent_column: :base_id, scope: :user, dependent: :destroy, order_column: :multiplier - scope :defaults, -> { where(user: nil) } - - after_save if: :base do |record| - record.move_to_ordered_child_of(record.base, :multiplier) - end + scope :defaults, ->{ where(user: nil) } + scope :ordered, ->{ + parent_symbol = Arel::Nodes::NamedFunction.new( + 'COALESCE', + [Arel::Table.new(:bases_units)[:symbol], Unit.arel_table[:symbol]] + ) + left_outer_joins(:base).order(parent_symbol, :multiplier) + } before_destroy do # TODO: disallow destruction if any object depends on this unit diff --git a/app/models/user.rb b/app/models/user.rb index e6275ef..900d6ea 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -11,7 +11,7 @@ class User < ApplicationRecord disabled: 0, # administratively disallowed to sign in }, default: :active - has_many :units, -> { order :lft }, dependent: :destroy + has_many :units, -> { ordered }, dependent: :destroy def at_least(status) User.statuses[self.status] >= User.statuses[status]