Rails と Alias
Rails でAlias を使いたい場合があります。
正規化されていない外部データベースのテーブルをモデルで扱うときなどは特に。
例えば、”製品コード(product_code)”という5桁の数字文字列があるとして、その先頭2桁が”品目グループコード”だったりする場合。
product_code から先頭2文字を切り出してitem_group_code として扱いたいわけです。
で、SQL だとこうなるわけですが。
SELECT SUBSTR(product_code, 0, 2)AS item_group_code FROM products;
Rails のActiveRecord だとこうですかね。
scope :product_codes, -> { select('SUBSTR(product_code, 0, 2)AS item_group_code)') }
これ、大変に格好悪いと思うのですよ。
何故ってselect に渡しているのが、文字列化したSQL の一部になっているからです。
SUBSTR ならまあSQL の予約語ではあるのですが、内容によっては特定のデータベースに依存した書き方をせねばならなくなるかもしれません。
それだとActiveRecord を使う意味が半減ですよね。
私としては、こんな感じで書けると嬉しいのですが。
scope :product_codes, -> { select(item_group_code: self[:product_code][0, 2]) }
ともあれ、SQLの部分文字列を埋め込むのではない書き方ってないものですかね。
と、現在alias_attribute とかあちこちドキュメントをひっくり返して調べ中です。