Рассмотрите следующий код, который должен быть брошен в AR, найдите:
conditions = []
conditions[:age] = params[:age] if params[:age].present?
conditions[:gender] = params[:gender] if params[:gender].present?
Я должен добавить другое условие, которое является ПОДОБНЫМИ критериями на атрибуте 'профиля'. Как я могу сделать это, поскольку, очевидно, ПОДОБНОЕ обычно делается через массив, не ключ хеша.
Вы можете задать область своей модели с помощью условий хеширования, а затем выполнить find
в области видимости с условиями массива:
YourModel.scoped(:conditions => conditions).all(:conditions => ["profile like ?", profile])
Когда вы вызываете поиск активной записи, вы сначала отправляете строку с условиями, а затем хеш со значениями вроде:
:conditions => [ "age = :age AND gender = :gender AND profile LIKE :profile", conditions ]
таким образом вы можете продолжать делать что вы делаете :)
Follwing уродлив, но работает
conditions = {} #This should be Hash
conditions[:age] = params[:age] if params[:age].present?
conditions[:gender] = params[:gender] if params[:gender].present?
conditions[:profile] = '%params[:profile]%' if params[:profile].present?
col_str ="" #this is our column names string for conditions array
col_str = "age=:age" if params[:age].present?
col_str+= (col_str.blank?)? "gender=:gender" :" AND gender=:gender" if params[:gender].present?
col_str += (col_str.blank?) 'profile like :profile' : ' AND profile like :profile' if params[:profile].present?
:conditions=>[col_str , conditions]