比方說,我有文章和標籤Rails3中 - 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
條已範圍標記之間的MANY_TO_MANY關係的船,其中 - 作爲它的名字說 - 讓我找回標註了文章一個特定的標籤
什麼煩惱我是這樣的:
$ 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)
有趣的聯繫:http://www.sergiy.ca/how-to-write-many-to-many-search-queries-in-mysql-and-hibernate/ – apneadiving 2011-05-22 14:53:09