日刊 あおのうま Vol.2752(2018.05.29)【ありそうでない】

投稿者: | 2018/05/29

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 とかあちこちドキュメントをひっくり返して調べ中です。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください