有没有办法使用一个命令来检索所有行并过滤它们?
所以,现在我有了条件逻辑
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
是否有减少代码行的技巧,理想情况下减少代码行? =)
答案 0 :(得分:1)
我认为您可以使用hash
的拒绝功能尝试这种方式 @movies = Movie.find(:all, :conditions => {:rating => rating_filter, :date => date_filter}.reject{|k, v| !v})
答案 1 :(得分:1)
或者,您可以使用has_scope gem。
有助于保持控制器的清晰和简洁。