2

例子:

type person = { name : string
                ; age : int
              }

db /person : intmap(person)

我知道如何从数据库中获得一个人,但我如何获得所有人?并将它们打印在 html 表中?

谢谢。

4

4 回答 4

4

这应该这样做:

my_html_list() =
  List.map(
    person -> <li>{person.name}</li>,
    IntMap.To.val_list(/person)
  )

render() = <ul>{my_html_list()}</ul>

...然后在您的服务器页面中调用 render() ...

于 2011-07-11T12:38:44.773 回答
3

简单的说:

  • /person[i]从数据库中获取元素 i
  • /person从数据库中获取整个 intmap
  • !/person为您提供数据库的句柄,您可以在该句柄上使用,例如 Db.intmap_fold_range 来优化部分访问
于 2011-07-11T13:07:00.650 回答
2

我建议您使用 Db.intmap_fold_range 而不是 InMap.fold。它将比 InMap.fold 更快,后者需要在折叠之前在 OPA 中构建所有地图。

http://opalang.org/resources/doc/index.html#db.opa.html/!/value_stdlib.core.db.Db.intmap_fold_range

这是您的类型的示例:

type person = { name : string
                ; age : int
              }

db /person : intmap(person)

add(name, age) =
  /person[age] <- { ~name; ~age }

fold_person(acc, id) =
 person = /person[id]
 <>{acc}</><li>{person.name} {person.age}</li>

start() =
  do add("name1", 1)
  do add("name2", 2)
  do add("name3", 3)
  Db.intmap_fold_range(
    @/person,
    fold_person,
    <></>, 0, none, /* acc, starting key, optional max */
    (_ -> true) /* check range */
  )

server = one_page_server("Hello", start)
于 2011-07-11T13:11:48.493 回答
1

在@shomodj 对我的回答发表评论之后,这是我打印人员列表的完整代码(受 Cédrics 代码的启发)

// Declare type person
type person = {
  name : string
  age : int
}

// Declare database
db /person : intmap(person)

// Add function
add(name, age) =
  /person[age] <- { ~name ~age }

// Add to database when server launches
do add("name1", 1)
do add("name2", 2)
do add("name3", 3)

// Build the persons <li> list
my_html_list() =
  List.map(
    person -> <li>{person.name}</li>,
    IntMap.To.val_list(/person)
  )

// Build the complete html list (with ul)
render() = <ul>{my_html_list()}</ul>

// Create the server
server = one_page_server("Hello", render)
于 2011-07-11T22:14:28.867 回答