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 は使えるんだよな.というのに気づいたもののその辺コード読まないとわからん…….