Майк, я немного поработаю над этим ответом, но я новичок в SQL и не совсем понимаю, как применить его в своей ситуации. Если вы хотите уточнить, как будет выглядеть строка запроса, в синтаксисе Rails 3 это будет здорово. Спасибо!

я есть следующий метод запроса в моей модели ActiveRecord:

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

Таким образом, он находит все записи, теги которых взяты из списка через запятую и преобразованы в массив.

В настоящее время это сопоставляет записи с ЛЮБЫМИ совпадающими тегами - как я могу сделать так, чтобы это совпадало со ВСЕМИ тегами.

IE: если в данный момент я ввожу: «синий, красный», тогда я получаю все записи, помеченные синим или красным.

Я хочу сопоставить все записи, отмеченные синим и красным.

Предложения?

-- РЕДАКТИРОВАТЬ --

Мои модели такие:

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 }
    select('distinct photos.*').joins(:tags).where('tags.name' => array )
  end
  ...
end

class Tag < ActiveRecord::Base
  has_many :taggings, :dependent => :destroy
  has_many :photos, :through => :taggings
end

class Tagging < ActiveRecord::Base
  belongs_to :photo
  belongs_to :tag
end

Тег имеет два атрибута: идентификатор и имя (строка).

Ответы на вопрос(1)

Ваш ответ на вопрос