RSpec: фиктивная ошибка SQL? - PullRequest
3 голосов
/ 22 марта 2011

У меня есть модель Фото со следующим методом для поиска связанных тегов по имени:

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

Если я использую это в консоли, то получится именно то, что я ожидал:

Photo.tagged_with('foo, bar, baz')
# Returns unique photos with tags named foo, bar, or baz

Однако я попытался построить это с помощью теста в 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

Этот тест не пройден со следующей ошибкой:

  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)>'

Итак, код работает, но тест не пройден. Что я делаю не так в моем тесте?

Ответы [ 2 ]

5 голосов
/ 22 марта 2011

Чтобы исправить эту ошибку, укажите, что именно вы хотите сгруппировать, так что вы должны сделать:

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

Даже если ваш код работает сейчас, с этим запросом вы действительно хотите быть явным.Это потому, что все таблицы, с которыми вы имеете дело (теги и фотографии), имеют столбец идентификатора.

5 голосов
/ 22 марта 2011

Похоже, что он жалуется, потому что вы группируете по идентификатору, а таблицы фотографий и тегов имеют идентификаторы (база данных не знает, имеете ли вы в виду photos.id или taggings.id, отсюда и «неоднозначная» ошибка). Попробуйте изменить .group(:id) на .group('photos.id') в вашем методе tagged_with.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...