find_or_create_by несколько атрибутов не находят записи при вызове в контексте объекта assign_to (ошибка AR в 2.3.11?) - PullRequest
5 голосов
/ 16 апреля 2011

Я добавляю 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. Перед тем, как отправить ошибку, кто-нибудь видит что-то, чего мне не хватает? Кто-нибудь видел эту проблему?

Ответы [ 4 ]

1 голос
/ 31 мая 2011

Я только что обновил приложение с Rails 2.3.10 до 2.3.11 и тоже столкнулся с этой ошибкой.

В нашем коде у нас есть:

      rate_plan = lodging.rate_plans.find_or_create_by_primary_code_and_secondary_code(rate_plan_code, inv_type_code)

, который работалштраф под 2.3.10.В соответствии с 2.3.11, rate_plan становится новой записью, хотя find_by_primary_code_and_secondary_code (rate_plan_code, inv_type_code) найдет существующую запись.Rate_plan не только новая запись в 2.3.11, но и не сохраняется, потому что наша проверка уникальности не выполняется.

Тьфу.Сейчас вернусь к 2.3.10.

0 голосов
/ 19 августа 2011

Проверка

auth['uid']

Полагаю, для тебя это пусто Вот почему

`authentications`.`uid` IS NULL) AND ((`authentications`.`user_id` = 10))

конфликтует

0 голосов
/ 16 июня 2011

Это определенно должно быть, как говорит Тудор Константин, проблема со значением auth ['provider'], так как оно выглядит как массив. Вы пытались сделать вызов пут над этой переменной? Каков результат?

Также я надеюсь, что вы знаете, что это:

Authentication.find_or_create_by_provider_and_uid ('facebook', 'XXXXX')

это не то же самое:

user.authentications.find_or_create_by_provider_and_uid ('facebook', 'XXXXX')

В первом случае вы просматриваете все экземпляры / строки аутентификации, в то время как во втором вы уменьшаете область поиска, так что только ищет экземпляры аутентификации / строки, которые принадлежат этому конкретному экземпляру пользователя.

0 голосов
/ 12 мая 2011

Каковы значения auth ['provider'] и auth ['uid']? Возможно, я ошибаюсь, но мне кажется, что auth ['provider'] - это ['facebook', 'XXXXXXX'], а auth ['uid'] - ноль.

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