Допустим, у меня есть связь many_to_many между статьями и тегами
class ArticleTag < ActiveRecord::Base
belongs_to :article
belongs_to :tag
end
class Tag < ActiveRecord::Base
has_many :article_tags
has_many :articles, :through => :article_tags
end
class Article < ActiveRecord::Base
has_many :article_tags
has_many :tags, :through => :article_tags
named_scope :tagged, lambda { |id| joins(:tags).where("tags.id = ?", id) }
end
Статья имеет помеченную область видимости, которая, как следует из названия, позволяет мне извлекать статьи, помеченные определенным тегом
Меня беспокоит следующее:
$ a = Article.create
=> #<Article id: 3, created_at: "2011-05-22 13:54:02", updated_at: "2011-05-22 13:54:02">
$ t1 = Tag.create
=> #<Tag id: 4, created_at: "2011-05-22 13:54:07", updated_at: "2011-05-22 13:54:07">
$ t2 = Tag.create
=> #<Tag id: 5, created_at: "2011-05-22 13:54:11", updated_at: "2011-05-22 13:54:11">
$ a.tags << t1
=> [#<Tag id: 4, created_at: "2011-05-22 13:54:07", updated_at: "2011-05-22 13:54:07">]
$ a.tags << t2
=> [#<Tag id: 4, created_at: "2011-05-22 13:54:07", updated_at: "2011-05-22 13:54:07">, #<Tag id: 5, created_at: "2011-05-22 13:54:11", updated_at: "2011-05-22 13:54:11">]
$ Article.tagged(t1.id)
=> [#<Article id: 3, created_at: "2011-05-22 13:54:02", updated_at: "2011-05-22 13:54:02">]
$ Article.tagged(t2.id)
=> [#<Article id: 3, created_at: "2011-05-22 13:54:02", updated_at: "2011-05-22 13:54:02">]
$ Article.tagged(t1.id).tagged(t2.id)
=> []
Если статья помечена двумя тегами, объединение соответствующих областей не позволяет ее извлекать. Это предполагаемое поведение? Если это так, как я должен изменить свой код, чтобы эта последняя строка не возвращала пустой массив?
PS: вот сгенерированный SQL.
SELECT \"articles\".* FROM \"articles\" INNER JOIN \"article_tags\" ON \"articles\".\"id\" = \"article_tags\".\"article_id\" INNER JOIN \"tags\" ON \"tags\".\"id\" = \"article_tags\".\"tag_id\" WHERE (tags.id = 4) AND (tags.id = 5)