忍者ブログ
ブログツール、2007/11/06作成
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

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
ついめ~じ
ブログ内検索
フリーエリア
サニーカメラ
Powered by Ninja Blog    template by Temp* factory    icon by MiniaureType

忍者ブログ [PR]