ActiveRecordのscopeで作成した条件などをSQLとして出力する

2012年12月3日

scope :active, where('deleted_at is null')
というスコープを設定したとして

この条件を含むSQLをコード内で取得したい場合ってありますよね。

SQL書いてでゴニョゴニョしたい場合とか…。

そんな時には
Article.active.to_sql
としてやれば、
select * from articles where deleted_at is null
というSQLが取得出来ます。

参考例

# === タグ
class Tag < ActiveRecord::Base
  scope :have_article, lambda{|sql| where("tags.id in (#{sql})")}
end

# === 記事
class Article < ActiveRecord::Base
  scope :active, where('deleted_at is null')
end

# === ルートコントローラー
class TopController < ApplicationController
  def index
    # ここで、
    # select tag_id from articles group by tag_id
    # というSQLが取得出来る
    articles_sql = Article.active.group('tag_id').select('tag_id').to_sql

    # ここで、
    # select * from tags where tags id in (
    #  select tag_id from articles group by tag_id
    # )
    # というSQLが内部で生成される
    @tags_have_articles = Tag.have_article(articles_sql)
  end
end

アンケート