Rails: Как бы я получить записи, где дочерний элемент включает в себя любой другой массив?
У меня есть модель пользователя и документа, которые оба имеют tag_lists (от act_as_taggable)
Я хочу найти Документы, имеющие какие-либо теги, которые есть у определенного пользователя. Так, например,
user.tag_list = ["ceo" , "sales"]
documentA.tag_list = ["ceo"]
documentB.tag_list = ["all-users']
documentC.tag_list = ["sales", "marketing"]
documentD.tag_list = ["marketing"]
Я хочу сделать что-то вроде
Document.where(tag_list.includes_any?("all-users" || user.tag_list))
-> который будет получать документ A,B,C.
Очевидно, синтаксис неправильный, но вы поняли идею. Как бы я сделал это эффективным способом?
-------Обновить
Просто отметьте, что tag_list не является прямым атрибутом модели User или Document, а является активным отношением записи из гема activ_as_taggable: как бы я назвал это в операторе.where?
2.1.1 :036 > Document.last.tag_list
Document Load (3.7ms) SELECT "assignable_objects".* FROM "assignable_objects" WHERE "assignable_objects"."type" IN ('Document') ORDER BY "assignable_objects"."id" DESC LIMIT 1
ActsAsTaggableOn::Tag Load (3.5ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = $1 AND "taggings"."taggable_type" = $2 AND (taggings.context = 'tags' AND taggings.tagger_id IS NULL) [["taggable_id", 52], ["taggable_type", "AssignableObject"]]
=> []
1 ответ
Это может помочь вам:
Document.where((tag_list-["all-users", user.tag_list].flatten).size != tag_list.size)