0

我的events控制器中有以下内容:

def index
  @event = Event.search(params[:search]).events_by_category(params[:cat]).order(...).paginate(...)
end

在我的events模型中,我有以下类方法:

def self.events_by_category(cat)
  if cat == 0
    all
  elsif cat && cat != 0
    where('category = ?', cat)
  else
    scoped
  end
end

在我看来,我有一个用于搜索的标准搜索框和用于类别选择的下拉列表。该类别options_for_select有一个包含["All Categories", 0]在其中的数组。

我的问题是:当在下拉列表中选择所有类别时,为什么这不返回任何结果而不是所有结果。而且,当我将数组更改为["All Categories", "ALL"]并且 if 语句if cat == "ALL"返回它时Undefined method 'order'

我认为这与在控制器中将搜索和 events_by_category 串在一起有关,但是当没有选择所有类别时,搜索和类别可以很好地结合使用...

任何帮助将不胜感激!

4

2 回答 2

2

首先回答您的第二个问题:问题是您的cat == "ALL"条件返回Event.allRuby Array,而不是ActiveRecord::Relation. order是一个 activerecord 方法而不是一个数组方法,这就是你得到错误的原因Undefined method 'order'

如果要返回 category 的所有结果,请ALL更改allscoped(这将返回一个没有条件的范围)。这将是可链接的,因此您可以使用orderand调用它paginate

至于你的第一个问题,params[:cat]是一个字符串,所以你应该检查是否cat == "0"不是cat == 0. 我认为这应该可以解决问题。

顺便说一句,您的条件有点令人费解:您正在测试 if 是否cat为 0,然后在 else 语句中检查它是否不是 0,但您已经知道它不是 0。我建议简化您的方法代码对此:

def self.events_by_category(cat)
  (cat && cat != "0") ? where('category = ?', cat) : scoped
end

这表示:如果类别存在但不存在"0"(即不是类别“所有结果”),则返回该类别的结果,如果不返回所有结果。

于 2012-12-11T04:41:59.630 回答
0
def self.events_by_category(cat)
 if cat == "0"
   all
 elsif cat && cat != "0"
   where('category = ?', cat)
 else
   scoped
 end
end


以上将起作用。

于 2012-12-11T04:57:18.143 回答