Неоднозначный столбец id в запросе ActiveRecord - PullRequest
1 голос
/ 16 мая 2011

У меня есть несколько сложные модели ActiveRecord (2.3.8) (не совсем, некоторые ассоциации и именованные области и одно кэшированное значение), и где-то в моем приложении я вижу следующий запрос MySQL (5.1):

SELECT `cases`.id FROM `cases`
INNER JOIN `contracts` ON `cases`.contract_id = `contracts`.id
WHERE ((case_status_id = 0 AND case_status_id IS NOT NULL) AND id = XXXX)
AND ((`cases`.`archived` = 0)
AND ((`contracts`.customer_id = XXXX)))
LIMIT 1

Очевидно, не самый читаемый запрос. Иногда ActiveRecord жалуется, что столбец 'id' неоднозначен, и я должен согласиться: -)

Однако это происходит только тогда, когда данные в базе данных «редки». У нас есть скрипт импорта, который заполняет эти таблицы, и чем больше данных вставляется, тем реже становятся эти ошибки.

Код, вызывающий исключение:

paginate_options = {:page => params[:page], :per_page => 25 }
options = paginate_options.merge(:include => [:active_status, :case_summary], :order => @sortable.order)
@cases = current_customer.cases.unarchived.paginate(options)

Где поле «активный статус» кэшируется:

belongs_to    :active_status, 
            :class_name   => "CaseStatus", 
            :foreign_key  => 'case_status_id'
caches_value  :case_status_id, 
            :sql => 'SELECT id FROM case_statuses WHERE case_id = #{id} ORDER BY id DESC LIMIT 1'

Трассировка стека выглядит следующим образом:

config/initializers/connection_fix.rb:  17:in `execute'
vendor/plugins/cached_values/lib/cached_value.rb:  91:in `update_cache'
vendor/plugins/cached_values/lib/cached_value.rb:  14:in `load'
vendor/plugins/cached_values/lib/cached_values.rb:  85:in `case_status_id'
plugins/will_paginate/lib/will_paginate/finder.rb:  82:in `paginate'
plugins/will_paginate/lib/will_paginate/collection.rb:  85:in `create'
plugins/will_paginate/lib/will_paginate/finder.rb:  76:in `paginate'

Итак, я предполагаю, что эта ошибка происходит при попытке обновить кэш в первый раз. Похоже, что этот запрос используется плагином cached_values ​​и внутри оператора will_paginate, но кэшированный запрос, используемый в этом операторе, не отображается в запросе выше.

Я также не понимаю, почему ActiveRecord запрашивает cases.id, когда есть также оператор id=XXXX. Я предполагаю, что оба запроса одинаковы id, но опять же, является довольно неоднозначно ..

Как я могу сказать ActiveRecord использовать явные имена таблиц? Или способ отладить способ построения этого запроса? Может ли плагин cached_values ​​зависеть от именованных областей и есть ли способ обойти это?

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