Ruby on rails 轨道不';t处理参数

Ruby on rails 轨道不';t处理参数,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在尝试实现高级搜索 我在模型中有: def self.filter(params) params.inject(self) do |scope, (key, value)| return scope if value.blank? case key when :min_size scope.scoped(:conditions => ["size >= ?", value]) when :max_size scope.scoped(

我正在尝试实现高级搜索

我在模型中有:

def self.filter(params)
params.inject(self) do |scope, (key, value)|
  return scope if value.blank?
  case key
    when :min_size
      scope.scoped(:conditions => ["size >= ?", value])
    when :max_size
      scope.scoped(:conditions => ["size <= ?", value])
    else
      scope.scoped(:conditions => ["created_at > ?", 4.weeks.ago]) 
  end
end
end
我用这个表格搜索:

<%= form_tag '/search', :method => "get" do |f|  %>
    <%= text_field_tag :min_size, params[:min_size] %>
    <%= text_field_tag :max_size, params[:max_size] %>
    <%= submit_tag "Search", :name => nil %>
<% end %>
这里可能有什么问题?在控制台中,它工作得很好

>> some = Listing.filter(:min_size => 40, :max_size => 50)
=> [#<Listing id: 1, title: "1 br apartment, Paris 16e", address: "1 Rue Monsieur-le-Prince", district: "Paris 6e", size: 42, rent: 2000, created_at: "2011-01-26 18:30:57", updated_at: "2011-01-26 19:00:44">]
>some=Listing.filter(:min\u size=>40,:max\u size=>50)
=> [#]

您可以使用Searchlogic gem来完成此操作

使用Searchlogic,您可以执行大于/小于搜索,如下所示:

irb> Listing.search(:size_gt => 10, :size_lt => 100)
在控制器中:

  def search
    @listings = Listing.filter(params)
    respond_to (:html)
  end
def index
  @search = Listing.search(params[:search])
end
在你看来:

<%= form_for @search do |f|  %>
  <%= f.text_field :size_gt %>
  <%= f.text_field :size_lt %>
  <%= f.submit "Search" %>
<% end %>

我猜问题在于开关案例比较:

case key
我认为从注入的角度来看,关键是“minu size”而不是:minu size,这就是为什么它总是转到else分支

编辑:

尝试将代码更改为

when "min_size"
  scope.scoped(:conditions => ["size >= ?", value])
when "max_size"
  scope.scoped(:conditions => ["size <= ?", value])
当“最小尺寸”
作用域(:条件=>[“大小>=?”,值])
当“最大尺寸”

scope.scoped(:conditions=>[“size谢谢你的答案,我可能会使用这个gem,但我仍然想找出我的代码有什么问题:-)@Ghinzu,我很高兴听到!在StackOverflow听到你接受了对你有用的答案,谢谢你。来自SO faq:当您决定哪个答案对您最有帮助时,单击答案左侧的复选框大纲,将其标记为已接受的答案。这会让其他人知道您收到了问题的好答案。这样做很有帮助,因为它会向其他人显示您从社区中获得了价值。“+1是一个很好的答案。我喜欢这样清晰简洁的回答。
case key
when "min_size"
  scope.scoped(:conditions => ["size >= ?", value])
when "max_size"
  scope.scoped(:conditions => ["size <= ?", value])