Как накопить массив всех объектов Active Record, которые связаны через has_many через отношения в Rails - PullRequest
0 голосов
/ 30 апреля 2020

Я использую Ruby 2.7 и Rails 6.0.

У меня есть база данных, которая включает People и Relationships.

В People.rb:

has_many :relationships_as_parent, :foreign_key => "parent_id", :class_name => "Relationship"
has_many :children, :through => :ownerships_as_parent

has_many :relationships_as_child, :foreign_key => "child_id", :class_name => "Relationship"
has_many :parents, :through => :ownerships_as_child

В Relationship.rb:

belongs_to :parent, foreign_key: "parent_id", class_name: "Person"
belongs_to :child, foreign_key: "child_id", class_name: "Person"

Если у меня есть семья из шести человек:

  • Алекс
  • Мать Алекса
  • отец матери Алекса (дедушка Алекса)
  • сын Алекса
  • дочь Алекса
  • второй ребенок матери Алекса (брат Алекса)

Как можно Я использую метод в моей модели People, который будет возвращать массив всех шести членов семьи и будет продолжать добавлять членов семьи в массив семейного дерева, пока кто-либо, связанный с родителями или дочерними отношениями с кем-либо еще, не будет включен в один массив? По сути, я хочу массив из целого расширенного семейства?

Что, если я хотел бы сделать то же самое в вопросе один, но только для членов семьи прямо над и под Алексом? Например, родители родителей (родителей и т. Д. c.) И дети детей (детей и т. Д. c.), Но не другие дети бабушек и дедушек (так что, поднимаясь только от Алекса, а потом от Алекса, не вверх и затем вниз или вниз, а затем вверх). Возможно ли это?

Как создать массив всех записей Relationship, которые соединяют всех людей в массиве extended_family_tree? Могу ли я сделать что-то вроде:

Relationship.where(parent_id.in(extended_family_tree.ids)).where(child_id.in(extended_family_tree.ids))

Редактировать - добавив код, который у меня сейчас есть для family_tree:

def family
  me = [self]
  children = self.children.where.not(id: self.id)
  parents = self.parents.where.not(id: self.id)
  family = children + parents + me
end

def relationships
  child_relationships = self.relationships_as_parent.where.not(child_id: self.id)
  parent_relationships = self.relationships_as_child.where.not(parent_id: self.id)
  relationships = child_relationships + parent_relationships
end

1 Ответ

0 голосов
/ 30 апреля 2020

Если вы правильно настроили has_many_through в Rails, вы можете просто сделать:

@person = People.find(id)
@person.relationships.to_a

Или то же самое с:

@person.family.to_a

An ActiveRecord :: Relation объект, который вы получаете из вызова @person.family, отвечает на метод to_a для преобразования в стандартный массив.

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

См. " Как мне отфильтровать массив хэшей, чтобы получить только ключи в другом массиве?"для получения дополнительной информации об итерации массива хэшей в Ruby.

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