1

1 つのコマンドを使用してすべての行を取得し、それらをフィルター処理する方法はありますか?

だから、今私は条件付きロジックを持っています

if rating_filter.nil?
  @movies = Movie.all
else
  @movies = Movie.find(:all, :conditions => {:rating => rating_filter})
end

つまり、フィールドのフィルターが設定されていない場合、このフィールドでフィルター処理したくありませんが、2 番目のコマンドに nil を渡すと、次のようになります。

 SELECT * FROM movies WHERE rating is NULL, though I need
 SELECT * FROM movies

複数のパラメーターがある場合、問題が発生します。両方が設定されている場合は、問題ありません。

@movies = Movie.find(:all, :conditions => {:rating => rating_filter, :date => date_filter})

ただし、1 つのフィルターが設定されていない場合は、ロジックを分岐して別のコマンドを取得する必要があります。

if ..
  @movies = Movie.find(:all, :conditions => {:rating => rating_filter)
else
 @movies = Movie.find(:all, :conditions => {:date => date_filter})
else
 @movies = Movie.all
end

コードの行数を理想的には 1 行に減らすトリックはありますか? =)

4

2 に答える 2

1

ハッシュの拒否機能でこの方法を試すことができると思います

    @movies = Movie.find(:all, :conditions => {:rating => rating_filter, :date => date_filter}.reject{|k, v| !v})
于 2013-10-27T15:10:35.473 に答える
1

または、 has_scope gemを使用することもできます。

コントローラーを明確かつ簡潔に保つのに役立ちます。

于 2013-10-27T17:09:47.357 に答える