模型中的一个或多个参数使用Ruby on Rails查找条件

时间:2009-11-02 01:08:25

标签: ruby-on-rails ruby

假设我的模型'Car'和控制器'cars',以及方法'display'。

我有多个属性,如:

  

in_productionyearmake

我可以轻松地做这样的事情来找到符合所有传递参数的汽车:

def display
  @cars = Car.find(:all, :conditions => { :in_production => #{params[:in_production]}, :year => #{params[:year]}, :make => #{params[:make]} })`
end

所以我正在做的是在菜单中编写硬链接,所以如果我想找到2009年生产的所有日产汽车,我会将这些值作为参数传递给我的链接。

在另一页上,我想展示2009年的每辆车都在生产中,只有两辆车而不是三辆车。什么是动态改变条件的最佳方法,以便它可以使用一个,两个或三个参数,同时使用相同的动作?

有什么想法吗?

4 个答案:

答案 0 :(得分:10)

首先,使用

:conditions => "in_production = '#{params[:in_production]}' AND year = '#{params[:year]}' AND make = '#{params[:make]}'"

易受SQL注入攻击。在数据库条件下使用它们之前,您需要转义用户提供的参数。

这样的事情可以让你根据参数是否存在更加动态地添加条件。我没有测试它,所以我可能很快就会编辑它......

def display
  conditions = []
  conditions << [ "in_production = ?", params[:in_production] ] if params[:in_production].present?
  conditions << [ "year = ?", params[:year] ] if params[:year].present?
  conditions << [ "make = ?", params[:make] ] if params[:make].present?
  @cars = Car.all(:conditions => conditions )
end

答案 1 :(得分:4)

当然要避开params并确保只查询要暴露的字段。除此之外,你可以使用Rails中内置的东西:

Car.find_all_by_in_production_and_year_and_make(in_production, year, make)

手动滚动条件可以允许应用其他逻辑(仅在年份介于x和y之间时按年份搜索等)。使用rails finders(反过来使用method_missing)可以保持API的清洁和灵活性,而不必直视SQL条件。

你可以构造一个Car#搜索方法,它将整个params哈希作为输入,其中params被清理并剥离非暴露字段,并使用param名称本身构造Car#find_all_by *方法调用。添加搜索的新条件就像在params中传递它们一样简单。

答案 2 :(得分:1)

您可以查看searchlogic。它使用一些缺少魔法的方法来构造可以做你想做的named_scopes。

http://github.com/binarylogic/searchlogic

答案 3 :(得分:1)