Play frameworkでisucon2アプリを書く-7

このエントリはPlay frameworkひとりアドベントカレンダーの22日目です。

今日は画面左側の recent_sold を実装します。
実装にさしあたりやることは次の2つ。

  • テンプレートを使ってviewを整理
  • recent_sold 部分を実装

テンプレートを使う

呼び出される側は慣習の通り main.scala.html としましょう。
→呼び出す側のviewから @main で呼び出せるようになります。

@(recent_solds:List[HashMap[String,String]])(content:Html)
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>isucon 2</title>
    <link type="text/css" rel="stylesheet" href="https://netmark.jp/css/ui-lightness/jquery-ui-1.8.24.custom.css">
    <link type="text/css" rel="stylesheet" href="https://netmark.jp/css/isucon2.css">
    <script type="text/javascript" src="https://netmark.jp/js/jquery-1.8.2.min.js"></script>
    <script type="text/javascript" src="https://netmark.jp/js/jquery-ui-1.8.24.custom.min.js"></script>
    <script type="text/javascript" src="https://netmark.jp/js/isucon2.js"></script>
  </head>
  <body>
    <header>
      <a href="https://netmark.jp/">
        <img src="https://netmark.jp/images/isucon_title.jpg">
      </a>
    </header>
    <div id="sidebar">
@if(recent_solds != null){
      <table>
        <tr><th colspan="2">最近購入されたチケット</th></tr>
        @for(recent_sold <- recent_solds){
        <tr>
          <td class="recent_variation">@recent_sold("artistName") @recent_sold("ticketName") @recent_sold("variationName")</td>
          <td class="recent_seat_id">@recent_sold("seatId")</td>
        </tr>
        }
      </table>
}
    </div>
    <div id="content">
@content
    </div>
  </body>
</html>

recent_soldを実装

元コードはこちら

filter 'recent_sold' => sub {
    my ($app) = @_;
    sub {
        my ($self, $c) = @_;
        $c->stash->{recent_sold} = $self->dbh->select_all(
            'SELECT stock.seat_id, variation.name AS v_name, ticket.name AS t_name, artist.name AS a_name FROM stock
               JOIN variation ON stock.variation_id = variation.id
               JOIN ticket ON variation.ticket_id = ticket.id
               JOIN artist ON ticket.artist_id = artist.id
             WHERE order_id IS NOT NULL
             ORDER BY order_id DESC LIMIT 10',
        );
        $app->($self, $c);
    }
};

クエリを実行してドンとするだけです。

playでfilterみたいなことができるような気はするのですが、よくわからないので地道に実装することにします。
だれか詳しい方がやりかたを教えてくれることを期待しましょう。
動けばいいんです。わかりやすいし。

	public static List<HashMap> getRecentSolds() {
		List sqlRows = Ebean
				.createSqlQuery(
						"SELECT stock.seat_id, variation.name AS v_name, ticket.name AS t_name, artist.name AS a_name FROM stock"
								+ " JOIN variation ON stock.variation_id = variation.id"
								+ " JOIN ticket ON variation.ticket_id = ticket.id"
								+ " JOIN artist ON ticket.artist_id = artist.id"
								+ " WHERE order_id IS NOT NULL"
								+ " ORDER BY order_id DESC LIMIT 10")
				.findList();
		List<HashMap> recent_solds = new ArrayList<HashMap>(
				sqlRows.size());
		for (SqlRow sqlRow : sqlRows) {
			HashMap recent_sold = new HashMap();
			recent_sold.put("seatId", sqlRow.getString("seat_id"));
			recent_sold.put("variationName", sqlRow.getString("v_name"));
			recent_sold.put("ticketName", sqlRow.getString("t_name"));
			recent_sold.put("artistName", sqlRow.getString("a_name"));
			recent_solds.add(recent_sold);
		}
		return recent_solds;
	}

↑これを定義して、viewに渡してあげれば万事解決。

明日からは /admin にいきましょう


See also