Я просто делал это сам, в конце алгоритм, который я использовал, точно не моделирует вытягивающие имена из шляпы, но это довольно чертовски близко. В основном переставьте список, и затем пару каждый человек со следующим человеком в списке. Единственная разница для вытягивания имен из шляпы - то, что Вы получаете один цикл вместо того, чтобы потенциально получить мини-подгруппы людей, которые только обмениваются подарками друг с другом. Если что-либо, что могло бы быть функцией.
Реализация в Python:
import random
from collections import deque
def pairup(people):
""" Given a list of people, assign each one a secret santa partner
from the list and return the pairings as a dict. Implemented to always
create a perfect cycle"""
random.shuffle(people)
partners = deque(people)
partners.rotate()
return dict(zip(people,partners))
Редко? Вы их еще не читали?
ActiveRecord может определять ваши отношения на основе FK (как и шаблоны Linq) и будет использовать IQueryable. Таким образом, вы получаете лучшее из обоих миров - они есть, если они вам нужны.
Если вы используете Simple Repo - нет - этого не происходит, и все выполняется вручную.
Существует простой вариант для управления внешними ключами, даже если вы используете простое репо. Проверьте этот пост для деталей.