2014-09-03 2 views
0

Итак, у вас есть маркерная модель с ключами, которые являются строками. Я выполняю поиск для токена, который существует, и когда я делаю прямое сравнение строки с записью, которую должен найти, я получаю пустой активный объект отношения записи.Активная запись «Где» Запрос Не удалось найти запись

Кто-нибудь знает, что здесь происходит? Я нахожусь на ногах моделей, используя имя модели «Token». Я не нашел ничего в этом.

Я сохранил ключ как «a» ниже, а Token.last.key - это запись базы данных, в которой есть соответствующий ключ.

irb(main):023:0> a 
=> "279684d7488254c41bb4039ad0962007" 
irb(main):024:0> Token.last.key 
    Token Load (0.4ms) SELECT "tokens".* FROM "tokens" ORDER BY "tokens"."id" DESC LIMIT 1 
=> "279684d7488254c41bb4039ad0962007" 
irb(main):025:0> a == Token.last.key 
    Token Load (0.1ms) SELECT "tokens".* FROM "tokens" ORDER BY "tokens"."id" DESC LIMIT 1 
=> true 
irb(main):026:0> Token.where(key: a) 
    Token Load (0.2ms) SELECT "tokens".* FROM "tokens" WHERE "tokens"."key" = '279684d7488254c41bb4039ad0962007' 
=> #<ActiveRecord::Relation []> 
irb(main):027:0> Token.where(key: a.to_s) 
    Token Load (0.2ms) SELECT "tokens".* FROM "tokens" WHERE "tokens"."key" = '279684d7488254c41bb4039ad0962007' 
=> #<ActiveRecord::Relation []> 

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

#DOES WORK 
    def current_user(key) 
    Token.all.first {|t| return t.key == key } 
    end 

Что я должен будет работать, но то, что я хотел бы, чтобы сделать это в базе данных с что-то вроде этого

#DOES NOT WORK 
    def current_user(key) 
    Token.where(key: key).try(:user) 
    end 

Ведение поиска на основе предложения ниже возвращающей ноль для find_by

irb(main):004:0> a = Token.last.key 
    Token Load (0.2ms) SELECT "tokens".* FROM "tokens" ORDER BY "tokens"."id" DESC LIMIT 1 
=> "279684d7488254c41bb4039ad0962007" 
irb(main):005:0> Token.find_by(key: a) 
    Token Load (0.2ms) SELECT "tokens".* FROM "tokens" WHERE "tokens"."key" = '279684d7488254c41bb4039ad0962007' LIMIT 1 
=> nil 

Решение было сделать это

def find_user_by_api(key) 
    tokens = Token.arel_table 
    Token.where(tokens[:key].matches(key)).try(:first).try(:user) 
end 
+0

Что произойдет, если вы пытаетесь 'Token.where (ключ: Token.last.key)'? – fivedigit

+0

@fivedigit, я получаю одинаковое отношение к активной записи. Это похоже на то, что он не может выполнить поиск. Я буду держать пари, что это будет связано с некоторыми зарезервированными словами, которые я топчу с помощью Token или key. Поиск user_id (который является другим атрибутом Token) работает правильно. – Austio

+0

@ Аустио вы используете 'default_scope' в модели« Token »? – itsnikolay

ответ

1

Желание это помогает

Token.find_by(key: a) 
+0

Спасибо, но все равно возвращает nil, обновит вопрос с другим наблюдением, которое я только что сделал – Austio

+0

@Austio вы могли бы запустить sql-консоль ('rails db') и выполнить« SELECT »токены». * FROM «токены» WHERE " tokens "." key "= '279684d7488254c41bb4039ad0962007'' какой результат? – itsnikolay

+0

@Austio это фактический ответ на ваш вопрос, либо вы ввели неправильное значение на 'a' –

Смежные вопросы