我有一个“嵌入式一对多”模型,如下所示:
class User
include Mongoid::Document
field :nickname
embeds_many :watchlists
end
class Watchlist
include Mongoid::Document
field :html_url
field :description
field :tags_array, type: Array
embedded_in :user
end
以及用于查询的“标准”,如下所示:
User.where('watchlists.tags_array' => %w[ruby web framework])
问题是它只匹配“watchlists.tags_array”呈现的“精确”单词序列,而我希望它匹配“ruby”、“web”和“framework”的所有排列。
前任。:
在数组的情况下:%w[ruby web framework],我需要匹配以下所有排列:
ruby web framework
ruby framework web
framework web ruby
framework ruby web
web framework ruby
web ruby framework
那可能吗 ?我怎样才能做到这一点 ?
更新:
查询有点复杂(我试图简化),它是一种嵌套的提取和排列,不适用于我的解决方案,也不适用于 Sergio Tulentsev 解决方案。在这两种情况下,它只匹配确切的数组:
Object.const_set :Competitor, Struct.new(:html_url, :description, :watchers, :forks)
def self.find_competitors(tags_array)
competitors = []
# doesn't work: User.where('watchlists.tags_array' => tags_array).only(:watchlists).each do |u|
User.all_in('watchlists.tags_array' => tags_array).only(:watchlists).each do |u|
u.watchlists.where(:tags_array => tags_array).each do |wl|
competitors << Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks)
end
end
return competitors
end
更新:
我只是想念,相同的“ all_in 标准”也进入内部循环......并且排列也很好:
User.all_in('watchlists.tags_array' => tags_array).only(:watchlists).each do |u|
u.watchlists.all_in(:tags_array => tags_array).each do |wl|
competitors << Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks)
end
end