Нравится ли "запросы" с ActiveRecord в Rails 2.x и 3.x? - PullRequest
19 голосов
/ 16 марта 2011

Я делаю подобные запросы в Rails 3.x

Speaker.where("name like '%yson%'")

, но я бы хотел избежать специфического кода БД.Какой правильный способ сделать это?

Если есть способ сделать это и в Rails 2.x, это тоже поможет.

Ответы [ 4 ]

23 голосов
/ 17 марта 2011

В Rails 3 или выше

Speaker.where("name LIKE ?", "%yson%")

В Rails 2

Speaker.all(:conditions => ["name LIKE ?", "%yson%"])

Избегайте прямой интерполяции строк, потому что значение не будет экранировано и вы уязвимы для атак SQL-инъекций.

11 голосов
/ 16 марта 2011

Вы можете использовать .matches для него.

 > t[:name].matches('%lore').to_sql
 => "\"products\".\"name\" LIKE '%lore'"

Фактическое использование в запросе будет:

Speaker.where(Speaker.arel_table[:name].matches('%lore'))
2 голосов
/ 16 марта 2011

Используйте поисковую систему, такую ​​как solr или sphinx, чтобы создать индексы для столбцов, для которых вы будете выполнять , как запросов. Как и запросы всегда приводят к полному сканированию таблиц, когда вы смотрите на план объяснения, поэтому вам действительно никогда не следует использовать их на рабочем сайте.

1 голос
/ 16 марта 2011

Не по умолчанию в Rails, так как существует так много опций БД (MySQL, Postgresql, MongoDB, CouchDB ...), но вы можете посмотреть такие гемы, как MetaWhere , где вы можете делать такие вещи, как :

Article.where(:title.matches => 'Hello%', :created_at.gt => 3.days.ago)
  => SELECT "articles".* FROM "articles" WHERE ("articles"."title" LIKE 'Hello%')
     AND ("articles"."created_at" > '2010-04-12 18:39:32.592087')

В общем, хотя вам, вероятно, понадобится какой-то специфичный для БД код или рефакторинг вашего кода (т.е. переопределение оператора .matches для символов в MetaWhere) для работы с другой базой данных. Надеемся, что вы не будете менять свою базу данных так часто, но если вы это делаете, у вас должно быть централизованное расположение, где вы определяете эти операторы для повторного использования. Имейте в виду, что оператор или функция, определенные в одной базе данных, могут быть недоступны в другой, и в этом случае использование этой обобщенной операции является спорным, поскольку вы не сможете выполнить поиск в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...