【问题标题】:Active Record "Where" Query Failing to find RecordActive Record "Where" 查询找不到记录
【发布时间】:2014-09-03 13:26:36
【问题描述】:

所以有一个令牌模型,它的键是字符串。我正在搜索存在的令牌,当我将字符串与记录进行直接比较时,它应该会发现我得到一个空的活动记录关系对象。

有人知道这里发生了什么吗?我是否使用模型名称“令牌”踩到模型脚趾。我在谷歌中没有找到任何关于它的信息。

我已将密钥存储为下面的“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 返回 nil

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

【问题讨论】:

  • 如果你尝试Token.where(key: Token.last.key)会发生什么?
  • @fivedigit,我得到相同的空活动记录关系。就像它无法进行搜索一样。我敢打赌,这将是由于我使用 Token 或 key 践踏了一些保留字。搜索 user_id(这是 Token 的另一个属性)可以正常工作。
  • @Austio 你在Token 模型中使用default_scope 吗?
  • @itsnikolay 没有默认范围。令牌只是属于_to :user

标签: ruby-on-rails activerecord ruby-on-rails-4


【解决方案1】:

希望对你有帮助

Token.find_by(key: a)

【讨论】:

  • 谢谢,但仍然返回 nil,将用我刚刚所做的另一个观察来更新问题
  • @Austio 你能运行 sql 控制台 (rails db) 并执行 SELECT "tokens".* FROM "tokens" WHERE "tokens"."key" = '279684d7488254c41bb4039ad0962007' 什么是输出?
  • @Austio 这是您问题的实际答案,您在a上输入了错误的值
  • @Austio 但是输出是什么?没有?
  • 返回什么tokens = Toke.arel_tableToken.where(tokens[:key].matches("%#{279684}%"))