Ruby on rails 为什么这是where().first\u或\u create仅在RSpec中生成不正确的SQL?

Ruby on rails 为什么这是where().first\u或\u create仅在RSpec中生成不正确的SQL?,ruby-on-rails,ruby-on-rails-3,activerecord,rspec,Ruby On Rails,Ruby On Rails 3,Activerecord,Rspec,我看到一个例子,Action.where(:name=>“fred”).first\u或\u create在RSpec下运行时生成错误的SQL,但在控制台中正确执行。我很困惑 这是模型。基础操作表有一个字段,一个名为名称的字符串: # file: app/models/action.rb class Action < ActiveRecord::Base def self.internalize(name) self.where(:name => name).first_

我看到一个例子,
Action.where(:name=>“fred”).first\u或\u create
在RSpec下运行时生成错误的SQL,但在控制台中正确执行。我很困惑

这是模型。基础
操作
表有一个字段,一个名为
名称
的字符串:

# file: app/models/action.rb
class Action < ActiveRecord::Base
  def self.internalize(name)
    self.where(:name => name).first_or_create
  end
end
以下是失败的原因:

1) Action intern should not create duplicate names
   Failure/Error: Action.internalize(:name => "fred")
   ActiveRecord::StatementInvalid:
     PG::Error: ERROR:  missing FROM-clause entry for table "name"
     LINE 1: SELECT  "actions".* FROM "actions"  WHERE "name"."name" = 'f...
     : SELECT  "actions".* FROM "actions"  WHERE "name"."name" = 'fred' LIMIT 1
   # ./app/models/action.rb:4:in `internalize'
   # ./spec/models/action_spec.rb:12:in `block (3 levels) in <top (required)>'
。。。这是错误的——它正在寻找一个名为“name”的表

奇怪的是,在控制台中键入完全相同的内容可以正常执行。是的,我记得(这次)在运行RSpec测试之前键入
rakedb:test:prepare
。我在跑步

Ruby version              1.9.3 (x86_64-darwin10.8.0)
Rails version             3.2.1
RSpec                     2.9.0
这到底是怎么回事?

操作。内部化(:name=>“fred”)
正在生成where子句:

where(:name => {:name => "fred"})

这意味着,您已经关联了表
名称
,该表的列
名称
具有值
fred

,这意味着它在Rails控制台上工作是一个幸运的巧合。@Mik:请解释一下?据我所知,
Action.internalize(:name=>“fred”)
生成where子句
Action.where(:name=>“fred”)
,否?[看。你从哪里得到嵌套哈希?@Mik:oohhhh!是的,我的打字错误太愚蠢了。调用Action.internalize(:name=>“fred”)应该是Action.internalize(“fred”).你不知道我有多少次盯着那一段代码,完全错过了它。顺便说一句,我认真考虑过删除整个问题,因为我犯了一个令人尴尬的错误。但也许它会帮助其他人!
Ruby version              1.9.3 (x86_64-darwin10.8.0)
Rails version             3.2.1
RSpec                     2.9.0
where(:name => {:name => "fred"})