Синтаксическая ошибка именованной области SQL

#ruby-on-rails #ruby #ruby-on-rails-3 #named-scope #named

#ruby-on-rails #ruby #ruby-on-rails-3 #именованная область #именованная

Вопрос:

Похоже, у меня какие-то проблемы с кавычками?

Моя именованная область:

 named_scope :find_by_name, lambda {|name| {:conditions => ["first_name LIKE '%?%' or last_name LIKE '%?%'",  name.split(' ').first, name.split(' ').last]}}
  

И вот как я выполняю поиск:

 find_by_name("#{search}")
  

И вот сгенерированный SQL и ошибка:

 ActionView::Template::Error (Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'foo'%' or last_name LIKE '%'foo'%')' at line 1: SELECT COUNT(*) FROM `users` WHERE (first_name LIKE '%'foo'%' or last_name LIKE '%'foo'%')):
  

Комментарии:

1. Пожалуйста, попробуйте last_name КАК ‘%’ ? ‘%’ и first_name похоже на ‘%’ ? ‘%’ в вашей именованной области и дайте мне знать, работает ли

2. Mysql :: Ошибка: У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘ ‘aen’ ‘%’ или last_name, НАПРИМЕР ‘%’ ‘tan’ ‘%’)’ в строке 1: ВЫБЕРИТЕ users .* ИЗ users ГДЕ (first_name, НАПРИМЕР ‘%’ ‘aen’ ‘%’ или last_name, НАПРИМЕР ‘%’ ‘tan’ ‘%’)

Ответ №1:

Вы можете попытаться избавиться от ‘%?%’ в вашем синтаксисе SQL и вместо этого использовать это:

 named_scope :find_by_name, lambda {|name| {:conditions => ["first_name LIKE ? or last_name LIKE ?",  '%'   name.split(' ').first   '%', '%'   name.split(' ').last   '%']}}
  

Пожалуйста, дайте мне знать, если это сработает.

P.S. Также не стоит определять область find_by_чего-то, Rails уже сделали это за вас, ActiveRecord динамически определяет такие методы.

Комментарии:

1. Я новичок. Вы хотите сказать, что я должен назвать это как-то иначе или есть лучший способ сделать это? кстати, name — это виртуальный атрибут.

2. Если name является виртуальным атрибутом, значит, все в порядке. Просто помните, что определение вами собственного find_by_something может переопределить существующий метод rails