Я добавляю omniauth к приложению rails 2.3.11 с помощью devise. Я в основном следую за railscast Райана Бэйта (с соответствующими модификациями для рельсов 2.3). Но я вижу что-то очень странное в тестировании этой части кода:
class AuthenticationsController < ApplicationController
...
def create
auth = request.env["omniauth.auth"]
current_user.authentications.find_or_create_by_provider_and_uid(auth['provider'], auth['uid'])
flash[:notice] = "Authentication successful."
redirect_to authentications_url
end
...
end
find_or_create всегда создает. В журнале я вижу этот выбор:
SELECT * FROM `authentications` WHERE (`authentications`.`provider` IN ('facebook','XXXXXXX') AND `authentications`.`uid` IS NULL) AND ((`authentications`.`user_id` = 10)) LIMIT 1
Это неправильный выбор для этого метода. auth ['provider'] и auth ['uid'] заполняются правильно (и это просто создает новую запись).
Еще большее недоумение: если я захожу в консоль и делаю Authentication.find_or_create_by_provider_and_uid('facebook', 'XXXXX')
, он работает нормально (находит существующую запись). Но если я получаю пользователя и выполняю user.authentications.find_or_create_by_provider_and_uid('facebook', 'XXXXX')
, он создает новую запись, и в журнале появляется такой же проблемный оператор запроса.
Я знаю, что могу обойти это (и Райан Бейтс все равно изменяет этот код позже), но это очень беспокоит. Я что-то упустил или это похоже на ошибку в ActiveRecord?
Это не относится только к OmniAuth или Devise. Перед отправкой я попробовал это с двумя другими классами (довольно простыми классами). Тот же результат [Klass.find_or_create_by_a_and_b ('A', 'B') работает, но parent.klasses.find_or_create_by_a_and_b ('A', 'B') генерирует выборку, которая хочет, чтобы b было нулевым, а a in ('A', 'B) «)].
Теперь я определенно думаю, что это ошибка 2.3.11. Перед тем, как отправить ошибку, кто-нибудь видит что-то, чего мне не хватает? Кто-нибудь видел эту проблему?