跨虚拟属性的where查询怎么做?
How do I do where queries across virtual attributes?
我有一个 Node
模型,它有一个虚拟属性 user_tags
。
控制台显示如下:
[42] pry(main)> n = Node.first
Node Load (0.5ms) SELECT "nodes".* FROM "nodes" ORDER BY "nodes"."id" ASC LIMIT 1
=> #<Node id: 6, name: "10PP Form Video", family_tree_id: 57, user_id: 57, media_id: 118, media_type: "Video", created_at: "2015-03-09 20:57:19", updated_at: "2015-03-09 20:57:19", circa: nil, is_comment: nil>
[43] pry(main)> n.user_tags
ActsAsTaggableOn::Tag Load (0.3ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = AND "taggings"."taggable_type" = AND "taggings"."context" = 'user_tags' [["taggable_id", 6], ["taggable_type", "Node"]]
=> [#<ActsAsTaggableOn::Tag id: 6, name: "danny@test.com", taggings_count: 1>, #<ActsAsTaggableOn::Tag id: 4, name: "gerry@test.com", taggings_count: 1>]
我想做的是在我的 Node
模型上创建一个 scope
,以映射到那些具有 user_tags
的节点。即 !user_tags.empty?
.
我该怎么做?
scope :with_tags, ->() { joins(:tags).uniq }
您不能使用 where
,因为标签存储在与您的模型不同的 table 中 - 您必须先与另一个 table 进行连接。现在可爱的部分 - joins
执行 INNER JOIN
这意味着它不会加载在另一个 table 中没有匹配记录的模型。现在剩下的就是去掉重复项(如果你有带有 n 个标签的模型,JOIN
将 return 记录 n 次)
我有一个 Node
模型,它有一个虚拟属性 user_tags
。
控制台显示如下:
[42] pry(main)> n = Node.first
Node Load (0.5ms) SELECT "nodes".* FROM "nodes" ORDER BY "nodes"."id" ASC LIMIT 1
=> #<Node id: 6, name: "10PP Form Video", family_tree_id: 57, user_id: 57, media_id: 118, media_type: "Video", created_at: "2015-03-09 20:57:19", updated_at: "2015-03-09 20:57:19", circa: nil, is_comment: nil>
[43] pry(main)> n.user_tags
ActsAsTaggableOn::Tag Load (0.3ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = AND "taggings"."taggable_type" = AND "taggings"."context" = 'user_tags' [["taggable_id", 6], ["taggable_type", "Node"]]
=> [#<ActsAsTaggableOn::Tag id: 6, name: "danny@test.com", taggings_count: 1>, #<ActsAsTaggableOn::Tag id: 4, name: "gerry@test.com", taggings_count: 1>]
我想做的是在我的 Node
模型上创建一个 scope
,以映射到那些具有 user_tags
的节点。即 !user_tags.empty?
.
我该怎么做?
scope :with_tags, ->() { joins(:tags).uniq }
您不能使用 where
,因为标签存储在与您的模型不同的 table 中 - 您必须先与另一个 table 进行连接。现在可爱的部分 - joins
执行 INNER JOIN
这意味着它不会加载在另一个 table 中没有匹配记录的模型。现在剩下的就是去掉重复项(如果你有带有 n 个标签的模型,JOIN
将 return 记录 n 次)