acts_as_taggable で find_by_sql を使わない find_tagged_with

acts_as_taggable 1.x ベースです.

module ActiveRecord
  module Acts
    module Taggable
      module SingletonMethods
        def find_tagged_with(taglist, options = {})
          taglist = Array(taglist)
          if options[:any] # taggable has any tag in taglist
            find(:all, :include => { :taggings => :tag }, :conditions => ["tags.name IN (?)", taglist])
          else # taggable has all tags in taglist
            taglist.collect {|tag|
              find(:all, :include => { :taggings => :tag }, :conditions => ["tags.name = ?", tag])
            }.inject {|prev, objs|
                prev & objs
            } || []
          end
        end
      end
    end
  end
end

find_by_sqlを使わないことの何がうれしいかというと with_scope が通るという一点にある.
あと自分の都合でデフォルトがAND検索に倒れてるので互換性がない(条件分岐反対にすればOK).ちょっと古いRailsだと動かないし.
……んでプロジェクトのページ見たらベータ版はいろいろカスタマイズ可能になっているけどやっぱり find_by_sql 使ってたりするのね.うーむ.しかもこれだとpatch書くのとか面倒すぎる.誰かー!(は?)
というかやっぱり with_scope 使ってる人なんていないのかなぁ…….

別に find_by_sql 使ってても scope さえ考慮すれば with_scope は使えるんだよな.というのに気づいたもののその辺コード読まないとわからん…….