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])