ActiveRecordのscopeで作成した条件などをSQLとして出力する
[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]