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"})