ruby-on-rails - 为什么where()。first_or_create仅在RSpec中生成不正确的SQL?

标签 ruby-on-rails ruby-on-rails-3 activerecord rspec

我看到一种情况,其中Action.where(:name => "fred").first_or_create在RSpec下运行时生成不正确的SQL,但在控制台中正确执行。我很困惑。

这是模型。基础actions表具有一个字段,一个名为name的字符串:

# file: app/models/action.rb
class Action < ActiveRecord::Base
  def self.internalize(name)
    self.where(:name => name).first_or_create
  end
end


这是rspec测试:

# file: spec/models/action_spec.rb
require 'spec_helper'
describe Action do
  describe 'intern' do
    it 'should create a new name' do  # works
      lambda { Action.internalize("fred") }.should change { Action.count }.by(1)
    end
    it 'should not create duplicate names' do  # fails
      Action.internalize(:name => "fred")
      lambda { Action.internalize("fred") }.should_not change { Action.count }
    end
  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)>'


似乎当记录存在时,Action.where(:name => "fred").first_or_create正在生成SQL

SELECT "actions".* FROM "actions" WHERE "name"."name" = 'fred' LIMIT 1


...这是错误的-它正在寻找一个名为“ name”的表。

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

Ruby version              1.9.3 (x86_64-darwin10.8.0)
Rails version             3.2.1
RSpec                     2.9.0


这里到底发生了什么?

最佳答案

Action.internalize(:name => "fred")正在生成where子句:

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


这意味着,您有一个关联的表name,该表的列name的值为fred

关于ruby-on-rails - 为什么where()。first_or_create仅在RSpec中生成不正确的SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9846567/

相关文章:

mysql - 如何根据第 3 个表所属的记录进行分组,有很多

ruby-on-rails - 将参数传递给局部 View

ruby-on-rails - 序列化哈希 rails

ruby-on-rails - Rails Controller 中未初始化的常量错误

ruby-on-rails - 使用 Roo Gem 在 Rails 中解析 XLS 电子表格

ruby-on-rails-3 - Rails cancan load_and_authorize_resource 不工作

ruby-on-rails - 如何使用 Rails 3 gem 'thumbs_up' 执行投票?

ruby-on-rails - best_in_place 在 Rails 4 中具有多对多关系

ruby-on-rails - Rails ActiveRecord 在控制台中找到

ruby-on-rails - Rails3 嵌套路由问题