Rails: имеет много сквозных ассоциаций - найти с условием AND, а не с условием OR - PullRequest
1 голос
/ 29 апреля 2011

У меня есть следующий метод запроса в моей модели 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

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

Ответы [ 3 ]

5 голосов
/ 03 мая 2011

Это должно работать:

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

Выше будут соответствовать фотографии с тегами красного и синего цвета не менее . Таким образом, это означает, что если на фотографии есть красные, синие и зеленые метки, эта фотография также будет соответствовать.

1 голос
/ 30 апреля 2011

LOL решение для этого не простая задача - я продумал это с точки зрения SQL, и это было УЖАСНО.Я подумал, что кто-то другой должен был попробовать это, поэтому я провел поиск и нашел этот пост, который должен помочь вам:

HABTM находит с объединениями "И", а не "ИЛИ"

1 голос
/ 29 апреля 2011

Вы можете изменить свой оператор выбора следующим образом:

select('distinct photos.*').joins(:tags).where('tags.name = ?',  array.join(' OR '))

Который будет правильно создавать строку ИЛИ в предложении where.

Иэн.

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