Я использую 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