Индексный атрибут на основе других атрибутов - PullRequest
0 голосов
/ 18 апреля 2019

У нас есть несколько моделей, которым требуются дочерние объекты

Каждый ребенок должен иметь уникальный последовательный идентификатор в качестве первичного ключа и уникальный последовательный идентификатор на основе отношения, как показано ниже:

Object id: 1
  Children id: 1, internal_id: 1
  Children id: 2, internal_id: 2

Object id: 2
  Children id: 3, internal_id: 1
  Children id: 6, internal_id: 2
  Children id: 7, internal_id: 3

Object id: 3
  Children id: 4, internal_id: 1
  Children id: 5, internal_id: 2
  Children id: 8, internal_id: 3
  Children id: 9, internal_id: 4

В настоящее время я использую фильтр before_save для закрепления internal_id, но я чувствую, что это плохая практика, и ее можно улучшить с помощью некоторой магии sql

def define_internal_id
  self.internal_id = 1 + Children.unscoped.where(parent_id: self.parent_id).count
end
before_save :define_internal_id

Есть ли лучший способ решить эту проблему?

1 Ответ

1 голос
/ 18 апреля 2019

Это как раз то, для чего предназначен act_as_list.Сначала добавьте его в свой Gemfile:

gem 'acts_as_list'

Затем в вашей модели добавьте:

acts_as_list column: :internal_id, scope: :parent_id

Это будет число internal_id, начиная с 1, с ограничением в столбце parent_id, как в твоих примерах.Если вы хотите начать с 0, установите параметр top_of_list: 0.

См. activ_as_list repo для других параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...