#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