Я столкнулся с такой проблемой, в которой присутствует в данных. при поиске в нем не отображаются данные. Я хочу удалить SQL-инъекцию Код:
@search_condition = ""
if !search_text.nil?
search_field = search_text.split("-")
@search_condition = "( address_books.organization_name like '#{search_text}%' or address_books.business_name like '#{search_text}%' or address_books.federal_tax_id like '#{search_text}%' or address_books.city like '#{search_text}%' or address_books.zip like '#{search_text}%' ) " if search_field.length == 1
if search_text.include? "-"
if search_field.length <= 1
@search_condition = " ( address_books.organization_name like '%" + search_field[0] + "%' "
@search_condition += " or address_books.business_name like '%" + search_field[1] + "%' "
@search_condition += " or address_books.federal_tax_id like '%" + search_field[2] + "%' "
@search_condition += " or address_books.city like '%" + search_field[3] + "%' "
@search_condition += " or address_books.zip like '%" + search_field[4] + "%' ) "
Вам нужно заменить всю вставку данных? и сохранить все данные, чтобы заменить это? в массиве
@search_condition = ""
if !search_text.nil?
search_field = search_text.split("-")
if search_field.length == 1
@search_condition = "( address_books.organization_name like ? or address_books.business_name like ? or address_books.federal_tax_id like ? or address_books.city like ? or address_books.zip like ? ) "
@search_condition_datas = ["#{search_text}%", "#{search_text}%", "#{search_text}%", "#{search_text}%", , "#{search_text}%"]
if search_text.include? "-"
if search_field.length <= 1
@search_condition = " ( address_books.organization_name like ? "
@search_condition += " or address_books.business_name like ?"
@search_condition += " or address_books.federal_tax_id like ?"
@search_condition += " or address_books.city like ?"
@search_condition += " or address_books.zip like ?"
@search_condition_datas = ["%#{search_text[0]}%", "%#{search_text[1]}%", "%#{search_text[2]}%", "%#{search_text[3]}%", , "%#{search_text[4]}%"]
И после того, как вы сможете выполнить поиск с помощью
User.find(:all, :conditions => [@search_condition] | @search_conditions_datas)
Этот код может быть рефакторингом после. Это действительно уродливо.
Здесь возможен рефакторинг с использованием Arel/Rails 3/REE 2010-02
class AddressBook < ActiveRecord::Base
def self.search(search_text)
unless search_text.nil?
t = arel_table
results = scoped
search_fields = search_text.split("-")
search_fields.map! {|f| "%#{f}" } unless search_fields.length == 1
results = results.where(
t[:organization_name].matches("#{search_fields[0] || search_text}%").
or(t[:business_name].matches("#{search_fields[1] || search_text}%")).
or(t[:federal_tax_id].matches("#{search_fields[2] || search_text}%")).
or(t[:city].matches("#{search_fields[3] || search_text}%")).
or(t[:zip].matches("#{search_fields[4] || search_text}%"))
)
end
results
end
end
Вот генерируемые SQL:
ree-1.8.7-2010.02 > AddressBook.search("something")
AddressBook Load (0.1ms) SELECT "address_books".* FROM "address_books" WHERE ((((("address_books"."organization_name" LIKE 'something%' OR "address_books"."business_name" LIKE 'something%') OR "address_books"."federal_tax_id" LIKE 'something%') OR "address_books"."city" LIKE 'something%') OR "address_books"."zip" LIKE 'something%'))
=> []
ree-1.8.7-2010.02 > AddressBook.search("1-2-3-4-5")
AddressBook Load (0.2ms) SELECT "address_books".* FROM "address_books" WHERE ((((("address_books"."organization_name" LIKE '%1%' OR "address_books"."business_name" LIKE '%2%') OR "address_books"."federal_tax_id" LIKE '%3%') OR "address_books"."city" LIKE '%4%') OR "address_books"."zip" LIKE '%5%'))
=> []
Очевидно, что в зависимости от ваших потребностей и того, как вы хотите искать, вы можете обновить это. Главное, что с Арелом вы можете просто привязать предложения к отношениям до момента, когда он действительно запросил. Я думаю, что это намного чище, чем создание строки или массива условий.