Изменить атрибут модели в ActiveRecord в Ruby on Rails - PullRequest
0 голосов
/ 28 июня 2019
class Person < ActiveRecord::Base
  belongs_to :parent, class_name: 'Person'
  has_many :children, class_name: 'Person', foreign_key: :parent_id
  has_many :grandchildren, class_name: 'Person', through: :children, source: :children
end

Я хочу, чтобы эта модель работала таким образом (неважно, как):

grandfather = Person.create(name: "Grandfather")
father = Person.create(name: "Father", parent: grandfather)
son = Person.create(name: "Son", parent: father)

grandfather.children.map(&:name)
=> ['father']
grandfather.grandchildren.map(&:name)
=> ['Son']

Так что идея состоит в том, чтобы вывести имя ребенка из заглавной буквы. Я могу использовать обратные вызовы или переопределить метод получения атрибута имени, но это относится как к детям, так и к внукам, так что это не главное.

1 Ответ

1 голос
/ 28 июня 2019

Я могу догадаться, что задача состоит в том, чтобы добавить знания о том, что запись - это "сын", а не "внук".Итак, у вас есть направленное дерево, и вам нужно знать глубину каждого узла:

class Person < ActiveRecord::Base
...
  def depth
    (parent&.depth || 0) + 1
  end

  def name
    if depth == 2
      super.downcase
    else
      super
    end
  end
end

Обратите внимание, что это неэффективно для больших структур данных с глубоким вложением, там лучше материализовать это в дополнительный атрибут, который должен бытьрассчитывается при настройке родителя.

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