【问题标题】:Haskell Persistent query on dates (Yesod)Haskell 对日期的持久查询 (Yesod)
【发布时间】:2017-04-07 14:20:58
【问题描述】:

我正在尝试将日期部分添加到博客文章的 URL 中,比如说

/blog/2016/11/23/my-blog-post-slug

我不仅要检查蛞蝓,还要检查日期部分。这是我到目前为止得到的:

getBlogPostR :: Int -> Int -> Int -> Slug -> Handler Html
getBlogPostR pathYear pathMonth pathDay pathSlug = do
  Entity _ BlogPost {..} <- runDB $ getBy404 $ UniqueBlogPostSlug pathSlug
  let (year, month, day) = toGregorian $ utctDay blogPostCreatedAt
  if (fromIntegral year /= pathYear && month /= pathMonth && day /= pathDay)
    then notFound
    else
      defaultLayout $ do
        setTitleI blogPostTitle
        $(widgetFile "blog/post")

似乎有点笨拙。有没有办法将今年、月、日部分添加为查询过滤参数? (我知道我可以执行原始查询,但这不是我想要的)

[附加信息]

我的模型定义如下:

BlogPost
  uuid Text
  title Text
  slug Text
  markdownContent Text
  createdAt UTCTime
  UniqueBlogPostUuid uuid
  UniqueBlogPostSlug slug
  Primary uuid

【问题讨论】:

  • 你能说明持久模型是如何定义的吗?
  • 好的,添加了型号说明

标签: sql haskell yesod haskell-persistent


【解决方案1】:
getBlogPostR :: Slug -> Handler Html
getBlogPostR pathSlug = do
  Entity _ BlogPost {..} <- runDB $ getBy404 $ UniqueBlogPostSlug pathSlug
  mYear <- lookupGetParam "year"
  mMonth <- lookupGetParam "month"
  mDay <- lookupGetParam "day"
  case (,,) <$> mYear <*> mMonth <*> mDay of
    Just (queryYear, queryMonth, queryDay) -> do 
      let (year, month, day) = toGregorian $ utctDay blogPostCreatedAt
      if (fromIntegral year /= queryYear && month /= queryMonth && day /= queryDay)
        then notFound
        else
          defaultLayout $ do
            setTitleI blogPostTitle
            $(widgetFile "blog/post")
    Nothing -> notFound

【讨论】:

  • 其实不是我的意思。我知道如何访问年、月和日的 URL 部分。我想把它放在持久查询中,所以我不需要自己检查这个:)
  • @Alebon 明白了。我可以帮你。您应该将UTCTime 视为时间戳或数字。最好的方法是检查UTCTime 标记是否存在于2016/11/23 开头到2016/11/23 结尾的范围内。唯一的问题是您可能必须针对特定的时区进行调整,或者这对您有影响吗?
  • 不,时区在这里不重要。传入参数与 db 中的 createdAt 日期对齐。我不使用特定的时区更改。非常感谢您的快速回复。
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多