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="/css/ui-lightness/jquery-ui-1.8.24.custom.css">
    <link type="text/css" rel="stylesheet" href="/css/isucon2.css">
    <script type="text/javascript" src="/js/jquery-1.8.2.min.js"></script>
    <script type="text/javascript" src="/js/jquery-ui-1.8.24.custom.min.js"></script>
    <script type="text/javascript" src="/js/isucon2.js"></script>
  </head>
  <body>
    <header>
      <a href="/">
        <img src="/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 にいきましょう

ads

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

ads