Rails acts_as_taggable - tagged_with 通过关系
Rails acts_as_taggable - tagged_with through a relation
假设我有一个 User / Post 模型,就像这里的例子:
https://github.com/mbleigh/acts-as-taggable-on#tag-cloud-calculations
User 有很多 Post 个,Post 个属于 User。 Post 有标签。我可以轻松搜索具有特定标记的用户 post 吗?
所以你基本上有:
class User
has_many :posts
end
class Post
acts_as_taggable
# under the hood, this declaration creates
# following relations
has_many :tags
has_many :taggings
end
您现在可以将以下关系添加到 User
:
class User
has_many :posts
has_many :tags, through: :posts
# has_many :taggings, through: :posts
end
现在查询给定的 @tag
应该很容易:
users_with_give_tag = User.joins(:tags).where("tags.id=?", @tag.id)
产生以下 SQL:
SELECT "users".* FROM "users"
INNER JOIN "posts" ON "posts"."user_id" = "users"."id"
INNER JOIN "taggings" ON "taggings"."taggable_id" = "posts"."id" AND "taggings"."context" = ? AND "taggings"."taggable_type" = ?
INNER JOIN "tags" ON "tags"."id" = "taggings"."tag_id"
WHERE (tags.id=1) [["context", "tags"], ["taggable_type", "Post"]]
假设我有一个 User / Post 模型,就像这里的例子:
https://github.com/mbleigh/acts-as-taggable-on#tag-cloud-calculations
User 有很多 Post 个,Post 个属于 User。 Post 有标签。我可以轻松搜索具有特定标记的用户 post 吗?
所以你基本上有:
class User
has_many :posts
end
class Post
acts_as_taggable
# under the hood, this declaration creates
# following relations
has_many :tags
has_many :taggings
end
您现在可以将以下关系添加到 User
:
class User
has_many :posts
has_many :tags, through: :posts
# has_many :taggings, through: :posts
end
现在查询给定的 @tag
应该很容易:
users_with_give_tag = User.joins(:tags).where("tags.id=?", @tag.id)
产生以下 SQL:
SELECT "users".* FROM "users"
INNER JOIN "posts" ON "posts"."user_id" = "users"."id"
INNER JOIN "taggings" ON "taggings"."taggable_id" = "posts"."id" AND "taggings"."context" = ? AND "taggings"."taggable_type" = ?
INNER JOIN "tags" ON "tags"."id" = "taggings"."tag_id"
WHERE (tags.id=1) [["context", "tags"], ["taggable_type", "Post"]]