Переменные связывания в Ruby - PullRequest
0 голосов
/ 30 ноября 2010

У меня в настоящее время есть таблица, которая перечислена следующим образом:

projects = Project.find(:all, :conditions => [conditions + "AND (name LIKE ? OR description LIKE ?)", "%#{params[:query]}%", "%#{params[:query]}%"])

где

 conditions = Project.in_used_projects(:alias => "projects")

Однако мне нужно включить третью переменную, которая не из таблицы Project, а из таблицы Tags. Мне нужен столбец Tag - > Names. Есть ли в любом случае я могу связать переменные из другой таблицы в Ruby? Project.find(all) автоматически передает SELECT * FROM Project в MYSQL. Кто-то предложил использовать функцию соединения, но я не уверен, как это будет работать. Есть идеи?

РЕДАКТИРОВАТЬ 1

Я попытался предложить ответ с использованием

projects = Project.find(:all, :joins => "tags", :conditions => [conditions + "AND (projects.name LIKE ? OR description LIKE ? OR tags.name LIKE ?", ["%#{params[:query]}%" * 3]].flatten)

но сейчас я получаю еще одну ошибку

Mysql::Error: Unknown table 'projects': SELECT Проекты .* FROM проекты tags WHERE ((projects.status = 2)AND (projects.name LIKE '%%' OR projects.description LIKE '%%' OR tags.name LIKE '%%')

Очень странно, учитывая, что таблица проектов существует. Почему Руби не распознает это сейчас, когда я включил другую таблицу?

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

Попробуйте это для размера:

projects = Project.find(:all, :joins => "tags", :conditions => [conditions + "AND (projects.name LIKE ? OR description LIKE ? OR tags.name LIKE ?", ["%#{params[:query]}%" * 3]].flatten)

Опция :joins указывает Active Record выполнить SQL-соединение к таблице tags, что позволит вам выполнять запросы к столбцу тегов.Также обратите внимание, что в этом примере я добавил префикс projects. к исходному столбцу name.Это означает, что ваша база данных не запутается, какой столбец name вы хотите;один из таблицы projects или tags.

1 голос
/ 30 ноября 2010

Есть ли у вас связь между проектами и тегами? Если причина вашего запроса в том, что он есть, он должен быть отражен в модели (например, с HABTM), что также позволит вам легко фильтровать на основе этих отношений без необходимости создания сложных запросов SQL.

0 голосов
/ 03 декабря 2010

Оказывается, это была простая синтаксическая ошибка

projects = Project.find(:all, :joins=>:tags, :conditions => [conditions + "AN    rojects.name LIKE ? OR projects.description LIKE ? OR tags.name LIKE ?)", "%#    ams[:query]}%", "%#{params[:query]}%", "%#{params[:query]}%"])

- правильный синтаксис.За: объединения должны следовать: теги, а не «теги» Еще раз спасибо за помощь всем

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