【发布时间】:2011-05-22 14:01:45
【问题描述】:
假设我在文章和标签之间有一个多对多关系
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)
【问题讨论】:
-
有趣的链接:sergiy.ca/…
标签: sql ruby-on-rails activerecord many-to-many named-scope