假设我的模型'Car'和控制器'cars',以及方法'display'。
我有多个属性,如:
in_production
,year
,make
我可以轻松地做这样的事情来找到符合所有传递参数的汽车:
def display
@cars = Car.find(:all, :conditions => { :in_production => #{params[:in_production]}, :year => #{params[:year]}, :make => #{params[:make]} })`
end
所以我正在做的是在菜单中编写硬链接,所以如果我想找到2009年生产的所有日产汽车,我会将这些值作为参数传递给我的链接。
在另一页上,我想展示2009年的每辆车都在生产中,只有两辆车而不是三辆车。什么是动态改变条件的最佳方法,以便它可以使用一个,两个或三个参数,同时使用相同的动作?
有什么想法吗?
答案 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。
答案 3 :(得分:1)