2011-02-10 11 views
1

モデルに検索メソッドを作成し、メソッドに渡された引数に基づいて条件を結合しようとしています。Rails:モデル内のメソッドチェーン

Item.search(args) 

モデル:

def self.search(args = {}) 
    include ActsAsTaggableOn # Tagging model for search 

    result = where("title LIKE ? OR description LIKE ? OR tags.name LIKE ?", "%#{args[:search]}%", "%#{args[:search]}%", "%#{args[:search]}%") 
     .joins("JOIN taggings ON taggings.taggable_id = items.id") 
     .joins("JOIN tags ON taggings.tag_id = tags.id") 

     # Categories 
     if args[:categories] 
     result.where(:category_id => args[:categories]) 
     end 

     # Order 
     if args[:order] == "category" 
     result.joins(:categories).order("categories.title ASC") 
     else 
     result.order("title DESC") 
     end 


     # Pagination 
     result.paginate(:per_page => 10, :page => args[:page]) 

end 

私がもしブロックを取り除くと直接その後チェーンを行う場合であっても、それはdoesnのしかし、何も初期の「場所」

コントローラ後の連鎖なかっますの仕事:

result = where(:foo => "bar") 
result.order("name DESC") 

...ちょうどどこを実行します。

アイデア?

ありがとうございます。

result = result.where(...) 

たびに更新スコープになるために戻って再度割り当てる必要があります:あなたは何をすべき

答えて

3

は、あなたが行くようにresultの定義を調整することにより、チェーンにあります。これは、result.whereが新しいスコープを返し、既存のスコープを調整しないためです。

+0

ありがとうございます! – jmccartie