Rails使用条件参数技巧查找方法

时间:2013-10-27 14:41:06

标签: ruby ruby-on-rails-3.2

有没有办法使用一个命令来检索所有行并过滤它们?

所以,现在我有了条件逻辑

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

即如果没有设置过滤字段,我不想按此字段过滤,但如果我将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})

但是如果没有设置一个过滤器,我需要分支我的逻辑以获得单独的命令:

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

是否有减少代码行的技巧,理想情况下减少代码行? =)

2 个答案:

答案 0 :(得分:1)

我认为您可以使用hash

的拒绝功能尝试这种方式
    @movies = Movie.find(:all, :conditions => {:rating => rating_filter, :date => date_filter}.reject{|k, v| !v})

答案 1 :(得分:1)

或者,您可以使用has_scope gem。

有助于保持控制器的清晰和简洁。