RSpec:伪SQL错误?

RSpec:伪SQL错误?,sql,ruby-on-rails,testing,rspec,Sql,Ruby On Rails,Testing,Rspec,我有一个照片模型,使用以下方法按名称搜索关联的标记: class Photo < ActiveRecord::Base has_many :taggings, :dependent => :destroy has_many :tags, :through => :taggings ... def self.tagged_with( string ) array = string.split(',').map{ |s| s.lstrip } j

我有一个照片模型,使用以下方法按名称搜索关联的标记:

class Photo < ActiveRecord::Base
  has_many :taggings, :dependent => :destroy
  has_many :tags, :through => :taggings 
  ...

  def self.tagged_with( string )
    array = string.split(',').map{ |s| s.lstrip }
    joins(:tags).where('tags.name' => array ).group(:id)
  end

  ...
end
然而,我试图使用RSpec中的测试来构建它,但是测试失败了。这是我的测试:

describe "tags" do
  it "should return a list of photos matching a string of tags" do
    t1 = Tag.create(:name=>'test')
    t2 = Tag.create(:name=>'bar')
    t1.photos << Photo.find(1,2,3)
    t2.photos << Photo.find(3,4)
    t1.save
    t2.save

    Photo.tagged_with('test').should have(3).photos
    Photo.tagged_with('bar').should have(2).photos
    Photo.tagged_with('test, bar').should have(4).photos
  end
end
描述“标签”是什么
它“应该返回一个与一系列标签匹配的照片列表”
t1=标记。创建(:name=>“测试”)
t2=标记。创建(:name=>'bar')

t1.photos似乎是在抱怨,因为您按id分组,并且photos和taggings表都有id(数据库不知道您指的是photos.id还是taggings.id,因此出现了“不明确”错误)。尝试将tagged_with方法中的
.group(:id)
更改为
.group('photos.id')

若要修复此错误,请明确说明分组依据,因此您可以执行以下操作:

joins(:tags).where('tags.name' => array ).group("photos.id")

即使您的代码现在可以工作,使用此查询您也确实希望显式。这是因为您正在处理的所有表(标签和照片)都有一个ID列。

啊,就是这样。布雷特,我欠你一杯啤酒什么的,你今天教了我很多。@Andrew Haha,直到你提到这件事,我才意识到是同一个人问的。没问题!现在作为一个礼仪问题,我得到了两个相同的正确答案,这两个答案在很久以前都说了相同的话。。。谁是第一个?我认为大家的共识是“这并不重要,因为15次重复不会影响任何人的一天”,但从技术上讲,如果你将鼠标悬停在“回答x分钟前”,你会在工具提示中看到一个实际的时间戳,这样你就可以知道谁是第一个。看起来我比迈克领先了4秒左右在此假设下,两者给出了相同的答案,并同时给出了问题的解决方案。。。掷硬币:好吧,谢谢你们的回答!
  1) Photo tags should return a list of photos matching a string of tags
     Failure/Error: Photo.tagged_with('test').should have(3).photos
     ActiveRecord::StatementInvalid:
       SQLite3::SQLException: ambiguous column name: id: SELECT COUNT(*) AS count_all, id AS id FROM "photos" INNER JOIN "taggings" ON "photos"."id" = "taggings"."photo_id" INNER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" WHERE "tags"."name" IN ('test') GROUP BY id
     # ./spec/models/photo_spec.rb:84:in `block (3 levels) in <top (required)>'
joins(:tags).where('tags.name' => array ).group("photos.id")