2016-10-20 9 views
0

私はRailsで新しく、自分のDBにある動物をそのプロパティの1つでフィルタリングしようとしています。私はコントローラのスコープでそれを作ることができ、URLのパラメータでアクセスできることを読んだが、自分のHTMLを作成するためにループを使用しているため、私にはうまくいかないと思う。レールでコレクションをフィルタリングする方法

(@animals)を使用しているコレクションにフィルタを追加する方法はありますか?

<% @animals.each do |animal| %> 
    <li> 
    <a href="#"> 
     <%=link_to animal.ncommon, animal %> 
    </a> 
    </li> 
<% end %> 

私は私の質問ではっきりしていたと思います。ご協力ありがとうございました!

+0

「コントローラのスコープで作ることができます...」という意味を明確にすることはできますか? – jacefarm

+0

私が参照していた範囲は、sameera207が以下にコメントしたものです。彼はスコープがモデルの中になければならないと私に訂正します。 –

答えて

0

scopeをコントローラーではなくモデルに移動することをお勧めします。こことその例。 (これはファイルの構造と名前によって変わることがあります)。

ここでは、動物をタイプ別にフィルタリングします。タイプ1とタイプ2と言うことができます。

#model app/models/animal.rb 
class Animal < ActiveRecord::Base 
    scope :by_type, -> (ty) { where(type: ty) } 
end 

#controller app/controllers/animals_controller.rb 

class AnimalsController < ApplicationController 
    ... other code 

    def index 
    # calls the by_type method/scope in the Animal model 
    # filter the records and assignes them to @animals varaible 
    @animals = Animal.by_type(params[:type]) 
    end 

    ... other code 
end 

このビューでは、ループを使用できます。あなたがフィルタリングしたいときは、パラメータを指定してindexアクションを呼び出す

例えばhttp://localhost:3000/animals?type=1

だから、アイデアはループ内でフィルタリングすることではない、が、@animals変数にフィルタリングされた結果を取得します。

+0

ありがとうございました!これは私がやらなければならない別の同様の仕事のために私を助けますが、私はループで私が話していたことができる別の解決策を見つけました。私は別のコメントに投稿します。あなたの答えをありがとう! –

0

私はループで使用できる解決策を見つけました。 は私が変更されました:

<% @animals.each do |animal| %> 

に:ここで

<% @animals.where("promo > ?", 0).each do |animal| %> 

- 私がゼロより大きいプロモーションを持っているすべての動物を得ます。
ありがとうございます!

+0

ちょっと@chavez、あなたのソリューションは正常に動作しますが、ビューでActiveRecordクエリを持つと、コードの匂いとみなされますのでご注意ください。 :) – sameera207

関連する問題