Область видимости RoR для каждого объекта массива - PullRequest
1 голос
/ 21 декабря 2011

Я довольно новичок в RoR, так что это может быть вопрос новичка, но я не смог найти ответ на него и решить проблему. Мне нужно проверить каждый отдельный элемент из динамического массива (который создается соединением HABTM через таблицу соединений) на наличие условия.

Прямо сейчас у меня есть что-то вроде этого:

scope :filter, lambda { |devicefilter, testtypefilter|
  {
    testtypefilter.each { |testtype|    
        :include => :tests,
        :conditions => ['(tests.device != ? OR tests.device IS ?) AND ? NOT IN tests.testtypes', devicefilter, nil, testtype]
    }
  }
}

Это показывает мне синтаксическую ошибку. Но я думаю, что даже если мне удастся заставить его работать таким образом, он не будет выполнять SQL-запрос правильно, так как ts и tts связаны с HABTM, поэтому значение в таблице равно NULL, и мне придется создать другое соединение в этом запросе. , Я действительно понятия не имею, как решить эту проблему. Любые советы будут полезны.

Спасибо, Niko

Edit: Мой контроллер выглядит так

if params[:d] == nil or params[:t] == nil
  @users = User.all
else
  @users = User.filter(params[:d], params[:t])
end

: d является фиксированным значением, которое приходит из select_tag : t - это массив, который приходит из набора динамических флажков

все значения в порядке и правильно передаются в модель. Таким образом, представление или контроллер не должны быть проблемой.

Edit2: Поскольку это выглядит немного неясным, вот текущая ситуация: Есть форма, которая состоит из Select-Box и нескольких Checkboxes. Блок выбора получает свои значения из таблицы «устройства» и после отправки формы передает выбранное значение контроллеру в качестве параметра: d. Флажки - это список из всех записей таблицы «testtypes», и после отправки формы она передает массив всех проверенных testtype_ids из таблицы в контроллер в виде параметра: t. (работает правильно)

Теперь есть еще одна таблица «tests», которая имеет соединение HABTM со всеми записями в устройствах и типами тестов, так что я могу собрать специальные соединения с 1 устройства и нескольких тестовых типов вместе в одной записи.

Теперь в таблице «пользователи» есть столбец «тесты», который ссылается на таблицу «тесты» в подключении HABTM, поэтому 1 пользователь может (участвовал) в нескольких тестах (которые могут иметь несколько типов тестов).

Таким образом, после отправки формы значения: d и: t должны использоваться для запроса SQL для фильтрации всех пользователей по тестам (тогда как тесты зависят от устройств и типов тестов). Таким образом, все пользователи должны проверить в столбце тесты значения ссылающихся тестов в устройствах (: d) и testtypes (: t []).

Но так как тестовые типы (: t []) передаются в виде массива, я должен как-то проверить каждый элемент этого массива с помощью SQL-запроса. Или есть способ проверить весь массив?

Пример:

There are 3 Devices: (dynamic table)
A01
A02
A03
There are 3 Testtypes: (dynamic table)
TT01
TT02
TT03
There are 4 Tests: (dynamic table with HABTM devices and testtypes)
T1 = A01 - TT01/TT03
T2 = A01 - TT03
T3 = A02 - TT02/TT03
T4 = A03 - TT01/TT02/TT03
There are 5 Users: (dynamic table with HABTM tests)
U1 = ... T1 ...
U2 = ... T2/T4 ...
U3 = ... T3/T4 ...
U4 = ... T1/T2/T3 ...
U5 = ... T3/T4 ...

Now the Form will look like:
Device: Select-Box={A01/A02/A03}
Testtypes: Checkboxes={TT01/TT02/TT03}

If i select now A01, check TT01+TT02 and submit the query should return every single User who has not participated in the following Tests:
A01 - TT01
A01 - TT02

So at last i get a list of users that i could use for the test A01 - TT01+TT03, since there are no conflicts.
So the query would return every user who has not participated in T1, since that is the only conflict.
So the userlist would look like:
U2
U3
U5

Может ли кто-нибудь помочь мне с этим? Никто не понял? : '(

1 Ответ

3 голосов
/ 21 декабря 2011

Звучит так, будто вы хотите что-то вроде

scope :filter, lambda {|df| includes(:ts).where("foo_id in (?)", df)

, что позволит вам сделать

SomeModel.filter([23,24])

И что этот массив будет передан в лямбду для использования в условиях.

...