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

2012年12月3日

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

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

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

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

参考例
[ruby]# === タグ
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[/ruby]