Когда в Rails ActiveRecord будет генерироваться предложение IN с пустыми скобками?"В ()"? - PullRequest
1 голос
/ 09 ноября 2011

Предполагается, что я вызываю модель ActiveRecord Foo следующим образом:

Foo.sum(:bar, :conditions => { :baz_id => some_value })

Когда это приведет к неверному запросу SQL с пустым списком в предложении IN, как показано ниже:

SELECT sum(`foos`.bar) AS sum_bar FROM `foos` WHERE (`foos`.baz_id IN ())

Я используюactiverecord 2.3.12.

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Я не могу проверить прямо сейчас, так как у меня нет приложения с Rails 2.3, работающего на моей машине, но как насчет пустого массива?Я думаю, что AR проверяет, является ли то, что вы предоставляете, коллекцией (массивом), и если да, то генерирует часть «IN (...)», а затем генерирует записи для предложения «IN» с правильным экранированием.

EDIT :

Пустой массив генерирует (NULL), поэтому он действителен.Массив с пустым массивом генерирует сериализованный YAML, так что это не тот случай.

Я зарегистрировал исходный код , и возможно создать пустую часть "IN ()", вам просто нужно:

  1. укажите параметр, который является одним из следующих: Array, ActiveRecord::Associations::AssociationCollection, ActiveRecord::NamedScope::Scope, строка 2031

  2. он должен #respond_to?(:map), но не должен #acts_like?(:string), строка 2424

  3. его #empty? должен возвращать false по какой-то причине или не должен respond_to?(:empty?), строка 2425

  4. должна отвечать на #map, но должна возвращать пустой массив, строка 2428

А потом он генерирует то, что у вас есть.

Я понятия не имею, как это может произойти в реальном коде.Может быть, есть другие способы создать это дело в реальном коде ...

0 голосов
/ 09 ноября 2011

Это SQL, который он генерирует (IN ())? В моем тесте (AR 2.3.8) он выдает IN (NULL), который прекрасно работает.

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