0

我有一个包含 303 个 Game() 实体的 GAE 数据存储。

class Game(db.Model):
    title = db.StringProperty(required = True)
    slug = db.StringProperty(required = True)
    category = db.CategoryProperty()
    description = db.TextProperty(required = True)
    created = db.DateTimeProperty(auto_now_add = True)

'slug' 属性类似于标题,不同之处在于它用连字符替换所有空格并删除所有特殊字符。例如:(“第一场比赛!”变成“第一场比赛”)

在网站上,我列出了所有使用 Bootstrap 折叠手风琴的 303 款游戏。它工作得很好,但是因为有这么多游戏,我试图设置一个列出字母表的侧面导航。用户将单击其中一个字母以跳转到列表的特定位置。例如:(用户点击“N”,页面跳转到以“N”开头的游戏)。

我知道这是可行的,因为如果我将“slug”硬编码到 HTML 中,它将正确跳转到所需位置。但是,“slug”必须在正确的“slug”之前一,否则它不会正确跳跃。例如:(用户点击'N',HTML中的slug需要'my-last-m-game'才能跳转到正确的位置,并在页面顶部显示'N'个游戏)。

我的问题(对不起,冗长的解释)是,是否可以通过 GQL 查询来获取字母表中每个字母的最后一场比赛?还是将所有游戏放在列表/字典中并以这种方式获得正确的“slug”更好?或者我应该向数据本身添加一个属性,它允许我只搜索“A”游戏或“T”游戏的 GQL 搜索,以获得正确的“slug”。或者是否有我可以在 Bootstrap 中使用的偏移量,这将允许我获得第一个“N”游戏“slug”并使用它跳转到页面上的正确位置?

谢谢你的尽心帮助。这是我第一次在 stackoverflow 上发帖,如果我做得不对,请道歉。

4

2 回答 2

0

您可以对字符串使用前缀匹配。u"\ufffd" 是最高可能的 unicode 字符,因此按名称查询 < u"b"+u"\ufffd" 并按名称排序应该可以解决以 "b" 开头的元素。请注意,这种过滤/排序区分大小写,因此您可能需要为此存储一个小写的附加字段。

于 2013-01-28T11:25:08.970 回答
0

另一种选择是在 Game 上有一个名为 lastGameForLetter 的字段),对于大多数游戏,该字段设置为 null)。插入游戏时,需要进行额外检查以确保不需要更新,但会使查询更容易。对于很少写但经常阅读的东西,我们一直在做这样的事情。

于 2013-01-28T14:25:05.777 回答