TIM Labs

2014年5月アーカイブ

その1 - その4 まで、Arelの内部構造について説明してきました。 魔法のような技術に思われるArelも、意外と単純な構造をしていました。

今回は、Arelの内部構造をGraphvizで出力する方法を紹介します。 図で構造を出力してみると、クエリがどういうノードで構成されているのかイメージでき、Arelへの理解がもっと深まるかと思います。

以下、目次となります。

今回はArelがjoinクエリを生成する過程を学んでみます。 使用するサンプルコードは以下の通りです。

product = Arel::Table.new(:products)
corporation = Arel::Table.new(:corporations)
product_detail = Arel::Table.new(:product_details)

product
  .project('*')
  .join(corporation)
  .on(product[:corporation_id].eq(corporation[:id]))
  .to_sql
# "SELECT * FROM `products` 
# INNER JOIN `corporations` ON `products`.`corporation_id` = `corporations`.`id`"

product
  .project('*')
  .join(corporation)
  .on(product[:corporation_id].eq(corporation[:id]))
  .join(product_detail)
  .on(product[:id].eq(product_detail[:id]))
  .to_sql
# "SELECT * FROM `products` 
# INNER JOIN `corporations` ON `products`.`corporation_id` = `corporations`.`id` 
# INNER JOIN `product_details` ON `products`.`id` = `product_details`.`id`"

まずは、joinがどういう動きをするのか、から見ていきましょう。

以下、目次となります。

今回は以下のようなSQL生成の過程を学んでみます。

product = Arel::Table.new(:products)
product.project('*').where(product[:price].eq(1000)).to_sql
# "SELECT * FROM `products` WHERE `products`.`price` = 1000"

まずは

product[:price].eq(1000)

の部分から読んでみます。

以下、目次となります。

今回は、以下のような単純なSQLをarelで生成してみます。

select * from products;

Arelで書くと以下のようになります。

product = Arel::Table.new(:products)
product.project('*').to_sql # select * from products;

上記コードでなぜ select * from products; というsqlが生成されるのかを見ていきましょう。

以下、目次となります。

Rails3, ActiveRecordからは、内部でArelと呼ばれるSQL生成用のライブラリが利用されています。 今回、Arelが内部でどのようにSQLを生成しているのかを調査したので、当ブログにて公開いたします。 ちょっと長くなってしまったため、全5回に分割しました。

以下、目次となります。

このアーカイブについて

このページには、2014年5月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2014年4月です。

次のアーカイブは2014年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。