Asakusa Framework : ケーススタディ:結合モデルのCSV出力

f:id:teppei-studio:20131112202621j:plain

Asakusa Framework Advent Calendar 2013の10日目の記事です。

Asakusa Framework : MasterJoinのハマりやすいところ - TEPPEI STUDIOの記事で、「結合後モデルは出力できない」と書いてしまいましたが、某所で「できる」と御指摘を受けましたので、こちらで訂正したいと思います。

結合モデルのCSV出力例

はじめの一歩で使ったサンプルをベースに、結合モデルのCSV出力について例示したいと思います。処理設計は以下の通りです。

f:id:teppei-studio:20131119191410p:plain

結合モデル定義は以下のようにします。

"商品マスタ"
@directio.csv(
    has_header = TRUE
)
item_master = {
	"商品ID"
    @directio.csv.field(name = "商品ID")
	item_id : INT;

	"商品名"
    @directio.csv.field(name = "商品名")
	item_name : TEXT;
};

"売上明細"
@directio.csv(
    has_header = TRUE
)
sales_detail = {
	"明細ID"
    @directio.csv.field(name = "明細ID")
	sales_id : INT;

	"商品ID"
    @directio.csv.field(name = "商品ID")
	item_id : INT;

    "売上数"
    @directio.csv.field(name = "売上数")
    sales_number : INT;
};

"結合データ"
@directio.csv(
    has_header = TRUE
)
joined joined_sales_detail = item_master -> {
    "商品ID"
    @directio.csv.field(name = "商品ID")
    item_id -> item_id;

    "商品名"
    @directio.csv.field(name = "商品名")
    item_name -> item_name;
} % item_id + sales_detail -> {
    "明細ID"
    @directio.csv.field(name = "明細ID")
    sales_id -> sales_id;

    "商品ID"
    @directio.csv.field(name = "商品ID")
    item_id -> item_id;

    "売上数"
    @directio.csv.field(name = "売上数")
    sales_number -> sales_number;
} % item_id;

これでOKです。他の実装については、サンプル全体をGitHubに上げてあるので確認していただければと思います。

カラムの重複について

この例では、item_id が重複しています。この場合、左(つまり一つ目)が使われて、右(つまり二つ目)は無視されます。なので、正確にはこの例で、右(つまり二つ目)の item_id の定義は無意味です。