読者です 読者をやめる 読者になる 読者になる

二度忘れた事を三度忘れないようにする

技術的なことから趣味のことまで

Rails4のリレーションを使い分けたい

Ruby Ruby on Rails

個人的にはSQL文を組み立てるのは苦手ではありつつも、SQL文をある程度書けるようになるべきだと思っています。とはいいつつも、様々なフレームワークで実装されているモデルの機能というのは素晴らしいと思っています。特にRails4のhas_one,has_manyといったリレーション機能は非常に便利だと思います。

今回、Rails4でリレーションの設定をしたモデルを使っていて、発行されているクエリを見ていると非常に効率の悪いクエリが発生しているのに気付きました。

ざっくりいうと、SNSのようにユーザ一覧ページを表示した時に、一覧表示に必要のない参照先のテーブル情報まで引っ張っていました。一覧で100人表示したら不要なSELECTのクエリが100回(リレーション数によっては200,300となります)発生する動作をしていたので、流石に無いなと思って調べてました。

DB設計がなってない、と言われればそこまでなんですがそこは置いておいて。。。Rails4ではリレーションの設定をした場合、find_by_sqlとかなんとか使っても参照先のテーブルから情報を引っ張るようです。

あまりスマートではないですが、modelファイルをもう一個作って今回は回避しました。

class Users < ActiveRecord::Base
  has_one :profiles
  has_many :followers
# 略
end
class UsersNonRelational < ActiveRecord::Base
  self.table_name = 'users'
end

親テーブルの一覧が欲しいだけなんだけど、、、って時の対応でした。もっとスマートな方法・機能があれば教えてください。。。