рельсы - логические операторы в find - PullRequest
0 голосов
/ 24 июня 2010
 params[:codes] = "9,10"
    @result = Candidate.find :all,
         :joins =>
           params[:codes].split(',').collect {|c| ["INNER JOIN candidates_codes on candidates_codes.candidate_id = candidates.id, INNER JOIN codes on codes.code_id = candidates_codes.code_id AND codes.value = ?", c]}

Ошибка

Association named 'INNER JOIN candidates_codes on candidates_codes.candidate_id = candidates.id, INNER JOIN codes on codes.code_id = candidates_codes.code_id AND codes.value = ?' was not found; perhaps you misspelled it?

Обновление

CREATE TABLE `candidates` (
 `id` int(11) NOT NULL auto_increment,
`first_name` varchar(255) collate utf8_unicode_ci default NULL,
`last_name` varchar(255) collate utf8_unicode_ci default NULL,
`mobile_number` varchar(255) collate utf8_unicode_ci default NULL,
`address` text collate utf8_unicode_ci,
`country` varchar(255) collate utf8_unicode_ci default NULL,
`created_at` datetime default NULL,
`updated_at` datetime default NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;

  CREATE TABLE `candidates_codes` (
   `candidate_id` int(11) default NULL,
   `code_id` int(11) default NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `codes` (
 `id` int(11) NOT NULL auto_increment,
 `section` varchar(255) collate utf8_unicode_ci default NULL,
 `value` varchar(255) collate utf8_unicode_ci default NULL,
 `created_at` datetime default NULL,
 `updated_at` datetime default NULL,
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ;

Привет,

Я пытаюсь создать находку, которая может быть "ИЛИ" или "эфир"И "

например (псевдокод)

array a = (1,2)
array b = (1)

find(1 AND 2) = array a
find(1 OR 2) = array a, array b 

Мой код в настоящее время выглядит следующим образом -

@result = Code.all :joins => :candidates,
        :conditions => ["codes.id IN (?)", params['searches'][:Company]],
        :select => "candidates.*"

код представляет собой таблицу, полную кодов, которые описывают кандидата,между кодом и кандидатом существует отношение habtm

Единственный способ использования AND, который я вижу в руководствах, - это два столбца.

Большое спасибо

Alex

1 Ответ

1 голос
/ 24 июня 2010

Поскольку связь выполняется с помощью таблицы соединений, для выполнения И требуется ВНУТРЕННЕЕ СОЕДИНЕНИЕ, один раз для каждого термина в И.То, что вы пытаетесь сделать, - это найти данного кандидата, который имеет сопоставление для всех кодов.

Это может привести к путанице, поскольку вам нужно не только присоединиться к каждому термину,но также снова к таблице кодов, если вы сопоставляете поле, например значение.

Предполагая, что число терминов не слишком велико, и вы передаете в params [: codes] = "1, 5,9 ", и вы пытаетесь найти совпадение по кодам. Value:

Candidate.find :all,
    :joins =>
      params[:codes].split(',').collect {|c| "INNER JOIN candidates_codes#{c} on candidates_codes#{c}.candidate_id = candidates.id INNER JOIN codes#{c} on codes#{c}.id = candidates_codes#{c}.code_id AND codes#{c}.value = c"}

... или что-то в этом роде.Предупреждение о том, что я не тестировал этот код, но, если это то, что вам нужно, приведите его в порядок.

Примечание. Я удалил подстановку из последней версии (где символ? Заменяется переменной).) потому что объединения не поддерживают это.Сначала вы должны санировать параметры (т.е. убедиться, что они являются целыми числами или чем-то еще) или использовать защищенный метод sanitize_sql в модели.

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