3

我正在使用 Rails 2.3.8 开发并寻找更好的方法来构建查找条件。

在搜索页面上,就像用户搜索一样,用户设置搜索条件,查找条件取决于用户选择的条件,例如年龄、国家、邮政编码。

我在下面编写了代码来设置多个查找条件。

# Add condition if params post.
conditions_array = []
conditions_array << ['age > ?', params[:age_over]] if params[:age_over].present?
conditions_array << ['country = ?', params[:country]] if params[:country].present?
conditions_array << ['zip_code = ?', params[:zip_code]] if params[:zip_code].present?

# Build condition
i = 0
conditions = Array.new
columns = ''
conditions_array.each do |key, val|
  key = " AND #{key}" if i > 0
  columns += key
  item_master_conditions[i] = val
  i += 1
end
conditions.unshift(columns)
# condiitons => ['age > ? AND country = ? AND zip_code = ?', params[:age], params[country], prams[:zip_code]]

@users = User.find(:all, 
  :conditions => conditions
)

这段代码运行良好,但丑陋且不聪明。有没有更好的方法来建立查找条件?

4

2 回答 2

2

命名范围可以使它更具可读性,尽管体积更大,同时仍然可以防止 SQL 注入。

named_scope :age_over, lambda { |age|
  if !age.blank?
    { :conditions => ['age > ?', age] }
  else
    {}
  end
}

named_scope :country, lambda { |country|
  if !country.blank?
    { :conditions => ['country = ?', age] }
  else
    {}
  end
}

named_scope :zip_code, lambda { |zip_code|
  if !zip_code.blank?
    { :conditions => ['zip_code = ?', age] }
  else
    {}
  end
}

然后当你进行搜索时,你可以简单地将它们链接在一起:

@user = User.age_over(params[:age_over]).country(params[:country]).zip_code(params[:zip_code])
于 2013-10-30T22:49:47.130 回答
1

我不小心碰到了你的问题,即使它是旧的,这里是答案:

定义条件后,您可以像这样使用它:

# Add condition if params post.
conditions_array = []
conditions_array << ["age > #{params[:age_over]}"] if params[:age_over].present?
conditions_array << ["country = #{params[:country]}"] if params[:country].present?
conditions_array << ["zip_code = #{params[:zip_code]}"] if params[:zip_code].present?

conditions = conditions_array.join(" AND ")
@users = User.find(:all, :conditions => conditions) #Rails 2.3.8
@users = User.where(conditions) #Rails 3+
于 2013-06-14T07:39:02.917 回答