ActiveRecordのfindメソッドの:conditionsオプションって、INを判ってくれない・・・
class Hoge
:has_many :relations
:has_many :fugas, :through=>relations
class Fuga
:has_many :relations
:has_many :hoges, :through=>relations
class Relation
belongs_to :hoge
belongs_to :fuga
とあったとして、Hogeインスタンス上から、
Fugaインスタンス配列を元にRelationインスタンス配列がほしかったとする。
ナチュラルに考えて試してみる
self.relations.find(:all, :conditions=>["fuga_id IN (?)", fugas])
# nil
じゃあID配列で
self.relations.find(:all, :conditions=>["fuga_id IN (?)", fugas.map{|f| f.id}])
# nil
それじゃあID配列をjoinしてカンマ区切りに
self.relations.find(:all, :conditions=>["fuga_id IN (?)", fugas.map{|f| f.id}.join(',')])
# 最初の一つ目だけ
find_by~ならどうだ!!
self.relations.find_by_fuga_id(fugas.map{|f| f.id})
# 最初の一つ目だけ
まあ、当然ですよね・・・
結局find_by_sqlに頼ってしまうのね・・・
Relation.find_by_sql("SELECT * FROM relations WHERE hoge_id = #{self.id} AND fuga_id IN (#{fugas.map{|f| f.id}.join(',')})")
ActiveRecordって、ある一線を越えるとSQLを直接叩く方が早くてわかりやすいよね・・・
ちゃんちゃん
PR