yesod настойчивый: получить значение Entity в пределах деревни

скажем, мой файл конфигурации/моделей выглядит так:

Pet
    name Text
    owner OwnerId
Owner
    name Text

Я могу получить имя питомца следующим образом:

 $forall Entity key pet <- pets
     <span>#{petName pet} 

но как мне получить имя владельца от домашнего животного?

другими словами, что должно быть foo в следующем:

 <span>#{ownerName $ foo $ petOwner pet}

person user316146    schedule 01.02.2013    source источник


Ответы (1)


Yesod не создает функции для отношений, как (например) рельсы, поэтому вам нужно просто написать что-то подобное самостоятельно.

-- just one naive example
petOwnerName :: Pet -> Handler (Maybe Text)
petOwnerName p = do
    mo <- runDB $ get (petOwner p)
    return $ fmap ownerName mo

Обратите внимание, что это возвращается в обработчике (и это должно быть связано с требованием запроса к БД), это означает, что вы не можете использовать его напрямую как foo в интерполяции.

Принимая ваш пример буквально, выполнение этого действия из шаблона - это именно то, что вы ожидаете. Я хотел бы подчеркнуть, что это, как правило, запах дизайна, и я бы порекомендовал вам реструктурировать вещи, чтобы вы выполняли все свои запросы к БД заранее в обработчике, а затем передавали любые (чистые) значения, необходимые шаблону, непосредственно ему. Например, вы можете построить и передать [(Pet,Owner)] или [(Owner, [Pet])].

У меня есть помощники на одном из моих сайтов. которые абстрагируют общие способы запроса к БД отношений «один ко многим» и возвращают список кортежей, таких как (parent, child), я считаю, что это самый полезный метод.

Надеюсь это поможет.

person pbrisbin    schedule 01.02.2013